print(x) # prints x
当我想要在脚注中突出显示内容时,我在使用 minted 包排版代码时遇到问题:
\documentclass{article}
\usepackage{minted}
\begin{document}
Comments in Python\footnote{\mintinline{python}{print(x) # prints x}}.
\end{document}
问题是#
打印了两次:
如果我用百分号突出显示代码,我可以更改其 catcode:
\catcode`\%=11
Comments in \TeX\footnote{\mintinline{tex}{\LaTeX % comment}}.
但是,更改 的 catcode#
会导致错误,因为它在 的定义中使用\mintinline
。错误如下:
! Undefined control sequence.
\PYG #1#2->\FV@PYG
{#1}{\FancyVerbBreakStart #2\FancyVerbBreakStop }
l.2 ...x}\PYG{p}{)} \PYG{c+c1}{\PYGZsh{} prints x}
我该如何解决这个问题(以可扩展的方式)?我打算经常使用它,因为#
它是我打算排版的 ARM 汇编代码中的一个常见字符。(我无法在这里提供 ARM 示例,因为 ARM 词法分析器尚未包含在最新的 pygments 版本中)。
答案1
处理脚注中的逐字材料总是很麻烦。
您可以分两个步骤完成此操作:定义要排版的字符串,然后使用它。
\documentclass{article}
\usepackage{xparse}
\usepackage{minted}
\ExplSyntaxOn
\NewDocumentCommand{\mintedstring}{mv}
{
\tl_clear_new:c { l_minted_string_#1_tl }
\tl_set:cn { l_minted_string_#1_tl } { #2 }
}
\NewDocumentCommand{\mintinlinestring}{mm}
{
\minted_inline_string:nv { #1 } { l_minted_string_#2_tl }
}
\cs_new_protected:Nn \minted_inline_string:nn
{
\mintinline{#1}{#2}
}
\cs_generate_variant:Nn \minted_inline_string:nn { nv }
\ExplSyntaxOff
\setlength{\textheight}{2cm} % just to keep the picture small
\begin{document}
Comments in Python%
\mintedstring{print}{print(x) # prints x}%
\footnote{\mintinlinestring{python}{print}}.
\end{document}
答案2
我进一步研究了文档,发现有一些关于它的内容:
我想
\mintinline
在通常不允许逐字内容的上下文中使用。该\mintinline
命令在许多不允许使用普通逐字命令的地方已经起作用,例如\verb
,因此请务必先尝试一下。如果它不起作用,最简单的替代方法之一是将代码保存在框中,然后稍后使用它。例如,\newsavebox\mybox \begin{lrbox}{\mybox} \mintinline{cpp}{std::cout} \end{lrbox} \commandthatdoesnotlikeverbatim{Text \usebox{\mybox}}
因此,我的代码可以适用于:
\documentclass{article}
\usepackage{minted}
\begin{document}
\newsavebox\mybox
\begin{lrbox}{\mybox}
\mintinline{python}{print(x) # prints x}
\end{lrbox}
Comments in Python\footnote{\usebox{\mybox}}.
\end{document}