Questão Gerar documento com tabela de conteúdos contendo números de página usando Markdown ou algo semelhante?


Eu preciso criar um documento grande que, quando impresso, terá algumas centenas de páginas. Eu gostaria de fazer isso com algo como o Markdown. Um dos meus requisitos é que o documento deve ter números de página e um índice. Existe uma maneira de usar o Markdown ou uma linguagem de marcação semelhante para gerar automaticamente um índice com os números de página associados? Todas as coisas que eu já vi com o Markdown até agora podem gerar automaticamente uma tabela de conteúdo para a saída HTML, mas não há números de página associados.


4


origem


Provavelmente porque o HTML não tem nenhum conceito de números de página. O que é uma página? - Bob
O markdown não precisa ser convertido em HTML. - Jared
Parece que o que você está procurando é algo como PDF, ao contrário de algo que acaba sendo renderizado em HTML / XHTML. - killermist
Nota: para mostrar uma tabela de conteúdo para html (sem números de página, naturalmente), você precisa do --toc opção E a -s (standalone) opção. Eu não achei isso documentado em nenhum lugar .... - nealmcb


Respostas:


Soa como um trabalho para pandoc.

HTML não tem conceito de 'páginas'; provavelmente seria possível para kludge algo em conjunto com <div></div> tags, mas eu usaria apenas PDF:

pandoc --toc --chapters -o output.pdf input1.mkd input2.mkd

O Pandoc pode pegar um número arbitrário de entradas; Ele adiciona uma nova linha ao final de cada entrada e concatena-os. O comando acima criará um PDF projetado para ser vinculado como um livro - cada capítulo (representado por um título de nível 1) será iniciado em uma página ímpar. Se você não quiser esse comportamento, use o seguinte:

pandoc --toc -V documentclass=report -o output.pdf input1.mkd input2.mkd

Se você quiser economizar papel e não se importar com os capítulos que estão começando onde quer que o anterior termine (eles vão começar no meio de uma página), chame pandoc sem o --chapters opção:

pandoc --toc -o output.pdf input1.mkd input2.mkd

Você posso gere um HTML com um sumário, mas com todas as limitações listadas. Também é possível gerar documentos ODT e Microsoft DOC com pandoc, mas acho que eles não parecem muito bons, especialmente em comparação com a bela geração de PDF.

Criar PDFs com pandoc requer um mecanismo LaTeX para ser instalado; Isso é bastante trivial no Linux, onde você terá pelo menos um nos repositórios, mas no Windows pode ser um pouco mais difícil (eu não sei, eu nunca tentei). Como tal, é possível personalizar as coisas ao seu gosto com um modelo personalizado do LaTeX - mas eu ainda não entendi isso, então atualmente eu adoto os padrões (bem legais).


10



Parece bom e esta é provavelmente a solução que eu vou com. - Jared


Depois de alguns minutos no Google, notei que você precisa do seu próprio LaTeX-Template, que pode ser passado como uma opção para o pandoc:

pandoc --toc --chapter --template=yourtemplate.tex -o output.pdf input1.mkd

No entanto, seu modelo precisa de algumas modificações no site do LaTeX. Como sugestão, você pode usar:

Como ponto de partida, você pode usar o modelo a seguir. Copiei o modelo padrão https://github.com/jgm/pandoc-templates/blob/master/default.latex e acrescentou algumas coisas extras.

Tenho certeza de que você pode remover a maioria das combinações if-end. O modelo precisa ter mais opções para os usuários.

\documentclass[chapterprefix=false,titlepage=false]{scrreprt}
\usepackage[T1]{fontenc}

\usepackage{amssymb,amsmath}
\usepackage{fixltx2e} % provides \textsubscript
% use upquote if available, for straight quotes in verbatim environments
\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
  \usepackage[utf8]{inputenc}
$if(euro)$
  \usepackage{eurosym}
$endif$
\else % if luatex or xelatex
  \ifxetex
    \usepackage{mathspec}
    \usepackage{xltxtra,xunicode}
  \else
    \usepackage{fontspec}
  \fi
  \defaultfontfeatures{Mapping=tex-text,Scale=MatchLowercase}
  \newcommand{\euro}{€}
$if(mainfont)$
    \setmainfont{$mainfont$}
$endif$
$if(sansfont)$
    \setsansfont{$sansfont$}
$endif$
$if(monofont)$
    \setmonofont{$monofont$}
$endif$
$if(mathfont)$
    \setmathfont(Digits,Latin,Greek){$mathfont$}
$endif$
\fi
% use microtype if available
\IfFileExists{microtype.sty}{\usepackage{microtype}}{}
$if(geometry)$
\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry}
$endif$
$if(natbib)$
\usepackage{natbib}
\bibliographystyle{plainnat}
$endif$
$if(biblatex)$
\usepackage{biblatex}
$if(biblio-files)$
\bibliography{$biblio-files$}
$endif$
$endif$
$if(listings)$
\usepackage{listings}
$endif$
$if(lhs)$
\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{}
$endif$
$if(highlighting-macros)$
$highlighting-macros$
$endif$
$if(verbatim-in-note)$
\usepackage{fancyvrb}
$endif$
$if(tables)$
\usepackage{longtable}
$endif$
$if(graphics)$
\usepackage{graphicx}
% Redefine \includegraphics so that, unless explicit options are
% given, the image width will not exceed the width of the page.
% Images get their normal width if they fit onto the page, but
% are scaled down if they would overflow the margins.
\makeatletter
\def\ScaleIfNeeded{%
  \ifdim\Gin@nat@width>\linewidth
    \linewidth
  \else
    \Gin@nat@width
  \fi
}
\makeatother
\let\Oldincludegraphics\includegraphics
{%
 \catcode`\@=11\relax%
 \gdef\includegraphics{\@ifnextchar[{\Oldincludegraphics}{\Oldincludegraphics[width=\ScaleIfNeeded]}}%
}%
$endif$
\ifxetex
  \usepackage[setpagesize=false, % page size defined by xetex
              unicode=false, % unicode breaks when used with xetex
              xetex]{hyperref}
\else
  \usepackage[unicode=true]{hyperref}
\fi
\hypersetup{breaklinks=true,
            bookmarks=true,
            pdfauthor={$author-meta$},
            pdftitle={$title-meta$},
            colorlinks=true,
            urlcolor=$if(urlcolor)$$urlcolor$$else$blue$endif$,
            linkcolor=$if(linkcolor)$$linkcolor$$else$magenta$endif$,
            pdfborder={0 0 0}}
\urlstyle{same}  % don't use monospace font for urls
$if(links-as-notes)$
% Make links footnotes instead of hotlinks:
\renewcommand{\href}[2]{#2\footnote{\url{#1}}}
$endif$
$if(strikeout)$
\usepackage[normalem]{ulem}
% avoid problems with \sout in headers with hyperref:
\pdfstringdefDisableCommands{\renewcommand{\sout}{}}
$endif$
\setlength{\parindent}{0pt}
\setlength{\parskip}{6pt plus 2pt minus 1pt}
\setlength{\emergencystretch}{3em}  % prevent overfull lines
$if(numbersections)$
\setcounter{secnumdepth}{5}
$else$
\setcounter{secnumdepth}{0}
$endif$
$if(verbatim-in-note)$
\VerbatimFootnotes % allows verbatim text in footnotes
$endif$
$if(lang)$
\ifxetex
  \usepackage{polyglossia}
  \setmainlanguage{$mainlang$}
\else
  \usepackage[$lang$]{babel}
\fi
$endif$
$for(header-includes)$
$header-includes$
$endfor$

$if(title)$
\title{$title$}
$endif$
\author{$for(author)$$author$$sep$ \and $endfor$}
\date{$date$}

\begin{document}
$if(title)$
\maketitle
$endif$

$for(include-before)$
$include-before$

$endfor$
$if(toc)$
{
\hypersetup{linkcolor=black}
\setcounter{tocdepth}{$toc-depth$}
\begingroup
\let\clearpage\relax
\tableofcontents
\endgroup
}
$endif$
$body$

$if(natbib)$
$if(biblio-files)$
$if(biblio-title)$
$if(book-class)$
\renewcommand\bibname{$biblio-title$}
$else$
\renewcommand\refname{$biblio-title$}
$endif$
$endif$
\bibliography{$biblio-files$}

$endif$
$endif$
$if(biblatex)$
\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$

$endif$
$for(include-after)$
$include-after$

$endfor$
\end{document}

1





Você já pensou em usar o LaTeX?

As outras respostas sugerem o uso do Pandoc, que parece converter o Markdown em LaTeX, mas pode ser mais fácil começar do jeito certo no LaTeX.

O LaTeX é projetado para a criação de documentos impressos e possui itens como números de página e geração de TOC integrados. Confira este tutorial básico: http://www.andy-roberts.net/writing/latex


1