我想使用 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
以摆脱多余的空格(添加了很多%
),并暂时将其替换Verbatim
为BVerbatim
。避免在内联使用中留下任何多余的空格非常重要;示例显示常规文本可以与突出显示的内容相媲美。
性能评价: 如果您要重新定义\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。