pandoc如何解析.md文件中的乳胶代码?

How does pandoc parse latex code in a .md file?

我正在使用带有 knitr/rmarkdown/pandoc/latex 的 Rstudio 将 .Rmd 代码呈现为 pdf。我一直在努力解决某些乳胶代码完全按照预期呈现的问题,而非常细微的不同代码最终没有被正确解析,这导致我的 .tex 文件包含像“\textbackslash{}begin{table}”这样的行"\begin{table}".

谷歌搜索在处理 HTML 时揭示了类似的错误解析,但我直接从 .Rmd 到 .md 到 .tex 到 .pdf。

这完全取决于我正在使用的 Rstudio 的特定 version/platform,以及 R 包 knitr、xtable、rmarkdown、rmarkdown 模板等,所以我一直在努力想出一个 MWE。

(我确实检查过 m,y 版本的 pandoc >= 1.13,因为谷歌搜索表明早期版本中存在一个可能相关的错误。)

但是,我现在有了一个 MWE,我至少可以了解 pandoc 如何解析其临时 .utf8.md 文件以创建 .tex 文件。

以下降价从 .md 到 .tex 到 .pdf 被正确解析:

# Data Profile
\begin{table}[htbp]
\centering
\parbox{12cm}{\caption{\small Record Count of Things Summarized in this Table.\label{MyRef}\vspace{4pt}}} 
{\small
\begin{tabular}{llrrr}
Thing & Characteristic & Aspect 1 & Aspect 2 & Aspect 3 \ 
\hline
Some & data & rows & go & here \ 
more & data & rows & go & here \ 
\end{tabular}
}
\end{table}

但是还有一点降价,除了在 \caption 周围缺少 \parbox 之外,它在各个方面都与上面的相同(这就是 R xtable 包如何实现自己的 caption.width 选项), 被完全破坏。相关备用行:

\caption{\small Record Count of Things Summarized in this Table.\label{MyRef}\vspace{4pt}}

这两个markdown块被Rstudio根据下面的命令解析成各自的.tex块。我很满意这是在 pandoc 处理过程中发生的,因为我可以看到带有和不带 \parbox 的 .utf8.md 文件在其他方面是相同的,但是生成的 .tex 文件不同,以及其他所有内容(rmarkdown 模板, pandoc 选项等)保持完全相同。

/usr/local/rstudio-0.98.1103/bin/pandoc/pandoc +RTS -K512m -RTS MyDoc.utf8.md --to latex --from markdown+autolink_bare_uris+ascii_identifiers+tex_math_single_backslash --output MyDoc.tex --filter /usr/local/rstudio-0.98.1103/bin/pandoc/pandoc-citeproc --template /home/user/R/x86_64-unknown-linux-gnu-library/3.2/MyRmarkdownTemplate/rmarkdown/templates/report/resources/template.tex --highlight-style tango --latex-engine pdflatex --bibliography bibliography.bib

好:

\begin{table}[htbp]
\centering
\parbox{12cm}{\caption{\small Record Count of Things Summarized in This table.\label{MyRef}\vspace{4pt}}} 
{\small
\begin{tabular}{llrrr}
Thing & Characteristic & Aspect 1 & Aspect 2 & Aspect 3 \ 
\hline
Some & data & rows & go & here \ 
more & data & rows & go & here \ 
\end{tabular}
}
\end{table}

差:

\textbackslash{}begin\{table\}{[}htbp{]} \centering
\textbackslash{}caption\{\small Record Count of Things Summarized in This Table.\label{MyRef}\vspace{4pt}\} \{\small

\begin{tabular}{llrrr}
Thing & Characteristic & Aspect 1 & Aspect 2 & Aspect 3 \ 
\hline
Some & data & rows & go & here \ 
more & data & rows & go & here \ 
\end{tabular}
\} \textbackslash{}end\{table\}

换句话说,出于某种原因,如果没有 \parbox,pandoc 不会意识到它正在解析乳胶,直到它到达 \begin{tabular} 之前的左大括号内的 \small。使用 parbox,它知道它在 \begin{table}.

的第一个反斜杠处是乳胶

所以我的问题是:这是怎么回事?我该如何解决?

原来是标题中的 \vspace,或者至少删除它会导致正确的解析。必须 non-standard 足以使 LaTeX reader 失败。

见一辉对原问题的评论。他的 link (https://github.com/jgm/pandoc/issues/2493) 表明 pandoc 的 LaTeX 解析器默默地退回到将有问题的 LaTeX 解释为纯文本,我认为这解释了这里发生的事情。