如何使用 pandoc 在所有内联列表中自动执行 \shorthandoff?

如何使用 pandoc 在所有内联列表中自动执行 \shorthandoff?

为了在 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它只会将流中的下一个标记作为参数,但那时它已经改变了将字符转换为标记的方式。

这就是为什么你不能用一个命令来完成它。你必须在查看参数之前改变它看待参数的方式。

相关内容