minted、footnotes、babel 和“(双引号)交互导致的错误

minted、footnotes、babel 和“(双引号)交互导致的错误

我想使用 minted 放置一些内联代码,但是当我尝试输入空字符串“”时,出现“未定义的控制序列”错误。

示例代码:

\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[italian]{babel}
\usepackage{minted}

\begin{document}
\footnote{\mint{bash}/""/}
\end{document}

无论如何都会创建 pdf,但我得到的不是预期的“”

\def {\futurelet \protect \let \relax }\def {\futurelet \protect \let \relax }

(是的,我确实是说上述命令打印在pdf的脚注中)。

注释掉babel可以解决问题,但我的真实 TeX 文件中需要 babel。另外我不想使用``'',因为它们给出的输出与使用 插入的代码不匹配\inputminted。有办法解决这个问题吗?最后我该如何放置真正的双引号(又名 ASCII 34)?请注意\mint就像这样\verb,正常的 LaTeX 命令被忽略了。

顺便提一下,我正在使用答案是用minted排版内联代码,但这不是问题的原因。

答案1

如果你不必使用minted,你可以尝试我的pythontex包,使用相同的 Pygments 突出显示库。它提供了一个\pygment用于内联使用的命令,这似乎在脚注中工作得很好,只是#%字符不起作用(#%在普通文本中的脚注外工作得很好,如果需要这些字符,解决脚注问题并不难)。该包还提供了一个pygments环境和一个\inputpygments命令。

\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[italian]{babel}
\usepackage{pythontex}

\begin{document}
\footnote{Quotes: \pygment{bash}/""/.  More: \pygment{bash}/echo ${a[$i,$j]}/.}
\end{document}

在此处输入图片描述

更多解释和补丁minted

最终的问题是minted使用逐字内容(来自的 ShortVerb fancyvrb),这在脚注中存在问题。我的包使用不同的方法,并且还缓存所有突出显示的内容以提高速度。

这是 的一个粗略补丁,minted应该能满足您的需求。它变成\mint了一个内联命令。它基于我在我的包中所做的一些事情,因此它应该像我的包一样在脚注中工作。我不得不制作\minted@savecode和的新版本\minted@pygmentize以摆脱多余的空格(添加了很多%),并暂时将其替换VerbatimBVerbatim。避免在内联使用中留下任何多余的空格非常重要;示例显示常规文本可以与突出显示的内容相媲美。

性能评价: 如果您要重新定义\mint以供内联使用(或者,也许更好的是,为此目的定义一个新命令),您大概会相当频繁地使用内联代码。在我的系统上,\mint{bash}/""/使用 40 次时编译大约需要 12 秒;使用 80 次时大约需要 23 秒。 pythontex使用 40 次大约需要 3.5 秒\pygment{bash}/""/(这涉及运行 pdflatex,然后运行 ​​pythontex 脚本,然后再次运行 pdflatex,以返回突出显示的结果)。使用 80 次时大约需要 5.5 秒800使用,约 23 秒8000。所有这些数字都是在pythontex实际需要突出显示所有内容时才出现的;由于结果已保存,因此只有在修改代码时才需要 pythontex 脚本和第二次 pdflatex 运行。如果您在编辑非代码文本后重新编译,则只需运行 pdflatex,并且应该会获得或多或少正常的 pdflatex 速度。

在此处输入图片描述

\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[italian]{babel}
\usepackage{minted}

\makeatletter
\renewcommand\mint{%
  \begingroup
  \let\do\@makeother\dospecials
  \catcode`\{=1
  \catcode`\}=2
  \@ifnextchar[{\endgroup\mint@i}{\endgroup\mint@i[]}}
\def\mint@i[#1]#2{%
  \minted@resetoptions
  \setkeys{minted@opt}{#1}%
  \gdef\mint@lang{#2}%
  \begingroup
  \let\do\@makeother\dospecials
  \mint@ii}
\def\mint@ii#1{%
  \endgroup
  \def\mint@iii##1#1{%
    \endgroup
    \expandafter\edef\csname FV@SV@minted@verb\endcsname{\detokenize{##1}}%
    \minted@savecode@inline{\FV@SV@minted@verb}%
    \minted@pygmentize@inline{\mint@lang}%
    \DeleteFile{\jobname.pyg}}%
  \begingroup
  \let\do\@makeother\dospecials  
  \mint@iii}

\newcommand\minted@savecode@inline[1]{%
  \immediate\openout\minted@code\jobname.pyg
  \immediate\write\minted@code{#1}%
  \immediate\closeout\minted@code}

\newcommand\minted@pygmentize@inline[2][\jobname.pyg]{%
  \RecustomVerbatimEnvironment{Verbatim}{BVerbatim}{}%
  \def\minted@cmd{pygmentize -l #2 -f latex -F tokenmerge
    \minted@opt{gobble} \minted@opt{texcl} \minted@opt{mathescape}
    \minted@opt{startinline} \minted@opt{funcnamehighlighting}
    \minted@opt{linenos} -P "verboptions=\minted@opt{extra}"
    -o \jobname.out.pyg #1}%
  \immediate\write18{\minted@cmd}%
  % For debugging, uncomment:
  %\immediate\typeout{\minted@cmd}
  \ifthenelse{\equal{\minted@opt@bgcolor}{}}%
   {}%
   {\begin{minted@colorbg}{\minted@opt@bgcolor}}%
  \input{\jobname.out.pyg}%
  \ifthenelse{\equal{\minted@opt@bgcolor}{}}%
   {}%
   {\end{minted@colorbg}}%
  \DeleteFile{\jobname.out.pyg}}
\makeatother


\begin{document}

Before environment
\begin{minted}{bash}
""
\end{minted}
After environment

Before inline\mint[]{bash}/""/After inline

Before note\footnote{Before\mint{bash}/""/After}

\end{document}

编辑 2013/07/30

我现在正在维护minted,并已合并类似于此处补丁的代码,以\mintinline在开发版本中创建一个新的内联命令GitHub

相关内容