为了在 pandoc 中使用 Babel 获得正确的法语标点符号,我遵循了https://tex.stackexchange.com/a/505068/17868这需要在 babel 中启用简写。
然而,我发现,当我`:Joueur`
在 markdown 中做内联列表时,它们有时会在 PDF 中出现奇怪的现象,例如(冒号在末尾,有时在单词中间)。我将其缩小到LaTeX 中Joueur:
涉及法语速记的问题::
\passthrough{\lstinline!:Joueur!}
我的解决方法是放入 markdown
\shorthandoff{:}`:Joueur`\shorthandon{:}
生成的 LaTeX 如下所示:
\shorthandoff{:}\passthrough{\lstinline!:Joueur!}\shorthandon{:}
在 PDF 中这是无可挑剔的。
因此,为了避免使用 LaTeX 命令污染我的 markdown,我想将其全局应用。我尝试\passthrough
在 template.latex 文件中更改定义,如下所示:
%\newcommand{\passthrough}[1]{#1}
\newcommand{\passthrough}[1]{\shorthandoff{:}{#1}\shorthandon{:}}
但是,它无法生成正确的 PDF。我看我认为在 LaTeX 中我会得到
\passthrough{\shorthandoff{:}\lstinline!:Joueur!\shorthandon{:}}
它不起作用(shorthandoff/on 必须在 \passthrough 之外才能起作用)。
由于 Pandoc 使用该\passthrough
命令来处理任何内联列表,我不确定如何通过重新定义我可以在 Pandoc 中控制的内容(LaTeX 模板、标题包含)来包装它。我该怎么做?我是否\newcommand
错过了一些魔法?
编辑这个相关问题的答案https://tex.stackexchange.com/a/167598/17868解释了为什么不能将它们嵌入到宏中。如果 pandoc 没有钩子,那么我认为这是不可能的……
答案1
您可以将直通分为两个命令:
\newcommand{\passthrough}{\shorthandoff{:}\passthroughtwo}
\newcommand{\passthroughtwo}[1]{#1\shorthandon{:}}
在第二个命令评估参数之前,第一个命令关闭了简写。
在 (La)TeX 中,有眼睛、嘴巴和胃的概念贯穿文件内容。基本上,当编译器看到时\passthrough
,它会将其扩展为定义的内容(嘴巴)。\shorthandoff
不能只是扩展,因为它会改变编译器的内部工作原理(catcodes)并被发送到胃。当编译器评估时,\passthroughtwo
它只会将流中的下一个标记作为参数,但那时它已经改变了将字符转换为标记的方式。
这就是为什么你不能用一个命令来完成它。你必须在查看参数之前改变它看待参数的方式。