我不是 Latex 专家,因此在追踪这个问题时我已经达到了知识的极限。如果有人能解释一下这个问题,我认为这将非常有用。
问题描述(适用于 Windows,请参阅以下环境):当使用带有 minted 库的\newtcbinputlisting
from\tcolorbox
时,如果文件名有空格和/或下划线,最终结果和/或编译可能会失败或出现意外行为。如果使用单个或多个相同文件的片段,则问题会有所不同。我将介绍一些测试条件......但其他条件可能(可能)存在。
环境: 我正在运行 Windows 10 Education,64 位,版本 17134;MiKTeX:2.9.6930;minted 2.5;tcolorbox 4.15。
MWE 的设置: 要获得 MWE,请使用以下代码保存为最小.tex.然后使用以下批处理文件(见下文)创建所有必需的文件(它只是 minimal.tex 的多个副本)
如何运行并识别问题:
- (可选)使用
\inputminted
命令取消注释部分;使用命令注释部分\setCode
。 1.a - 结果:您应该看到八个没有问题的列表。(我认为这可以确保问题不是来自 minted 包。您同意吗?) - 重要的:删除目录“_minted-minimal”(铸造的缓存)如果您运行步骤 1。
- 重要的
\inputminted
:如果运行步骤 1,请注释掉 ALL 。 \setCode
对代码 1a 至代码 4a(最后四个)的 注释。4.a - 结果:您应该看到四个列表,没有任何问题。 4.b——变体有问题:正如您在标题中看到的,使用或不使用双引号很重要……并且取决于文件名中是否存在空格/下划线。添加/删除双引号会改变结果。作为“一般”规则,带空格的文件名必须带引号,而没有空格的文件名不能带引号。(应该检查文件名是否有空格……并添加双引号?)- 重要的:删除目录“_minted-minimal”(生成的缓存)。这确保了下一个场景的“全新”开始:每个源文件有多个代码片段。
- 取消
\setCode
代码 1a 至代码 4a(最后四个)的注释。 4.a - 结果:文档已生成,但是:发出 Python 错误(见下文)。在代码 6 中,缺少双引号导致列表中出现“伪像”(空格后的文件名剩余部分)。
注意事项:要完全理解问题,必须通过针对每种情况添加/删除双引号来进行多次测试。由于结果与输入/启动条件的“微妙性”,必须检查一些关键方面:
- (最重要的)编译时是否有铸造缓存(_minted-minimal 目录)会影响结果,因此请务必将其删除以测试第一个代码片段的插入。
- 请注意,下划线后加空格和下划线后加空格会产生不同的结果。
- 请注意,Same-FILE 片段可能会产生 Python 错误(取决于双引号的使用!!)
- 更为复杂的是...请注意,下划线永远不会被转义...但是...如果使用 \underscore 包...在第一次编译时只会生成最后三个代码片段...之后生成四个...
相关/重复我发现了一些潜在的重复/相关(从根本原因可能相同的意义上来说!?)并且我甚至在 tcolorbox 上提交了一个错误(现在已关闭...因为事实上双引号有时可以解决问题)。 在此处输入链接描述 列出名称/路径中带有下划线的文件 设置 minted 和 tcolorbox 以包含源代码和设置标题时出现问题 仅让文件名显示在列表环境中
用于设置的批处理文件
mkdir lst
copy minimal.tex "./lst/mintsn_iptest.tex.01"
copy minimal.tex "./lst/mints niptest.tex.01"
copy minimal.tex "./lst/mints n_iptest.tex.01"
copy minimal.tex "./lst/mints_n iptest.tex.01"
copy minimal.tex "./lst/sn_iptest.tex.01"
copy minimal.tex "./lst/s niptest.tex.01"
copy minimal.tex "./lst/s n_iptest.tex.01"
copy minimal.tex "./lst/s_n iptest.tex.01"
Python 错误
Process started: pdflatex.exe -synctex=1 -interaction=nonstopmode -shell-escape "minimal".tex
File "<string>", line 1 import sys; import os; import textwrap; from io import open; fname = os.path.expanduser(os.path.expandvars(""./lst/sn_iptest.tex.01"")); f = open(fname, "r", encoding="UTF8") if os.path.isfile(fname) else None; t = f.readlines() if f is not None else None; t_opt = t if t is not None else []; f.close() if f is not None else None; tmpfname = os.path.expanduser(os.path.expandvars("minimal.pyg")); f = open(tmpfname, "w", encoding="UTF8") if t is not None else None; fvstartnum = 10; fvstopnum = 15; s = fvstartnum-1 if fvstartnum != 0 else 0; e = fvstopnum if fvstopnum != 0 else len(t_opt); [f.write(textwrap.dedent("".join(x))) for x in (t_opt[0:s], t_opt[s:e], t_opt[e:]) if x and t is not None]; f.close() if t is not None else os.remove(tmpfname); ^ SyntaxError: invalid syntax
MWE(也用作外部列表文件...已重命名)
\documentclass{article}
% General settings
\usepackage[utf8]{inputenc} % Input encoding
\usepackage[T1]{fontenc} % Output encoding
%\usepackage{underscore}
%===============================================================================
% Source Code Style using mint package and tcolorbox package
% Preamble Setting for Code Listings using {tcolorbox} and {minted} packages
\usepackage{varwidth}
\usepackage[minted,skins,breakable]{tcolorbox} % tcolorbox with extra packages
\usetikzlibrary{shadings}
\newtcbinputlisting[auto counter, number within=chapter, list inside=srccode,
number freestyle={\noexpand\textbf{Code \noexpand\thechapter.\noexpand\arabic{\tcbcounter}}:}]
{\setCode}[4][]{% Options for the listings (Seven parameters- NO defaults)
minted options={fontsize=\footnotesize, autogobble, %outputdir=./aux-files/,
breaklines, breakanywhere, style=emacs, linenos, #1},
minted language = tex,
title ={\textbf{\thetcbcounter} #3},
listing file = {#2},
label = {#4},
listing only,
}
\newcommand{\separator}{\noindent\rule{8cm}{0.4pt}}
\begin{document}
Start document here with something simple:
% No spaces
First... a control sequence (Optional).
Use minted directly. NOTE the (Required) use of - "".
% \separator
% \inputminted[firstline=5, lastline=10]{tex}{"./lst/mintsn_iptest.tex.01"}
% \separator
% \inputminted[firstline=5, lastline=10]{tex}{"./lst/mints niptest.tex.01"}
% \separator
% \inputminted[firstline=5, lastline=10]{tex}{"./lst/mints n_iptest.tex.01"}
% \separator
% \inputminted[firstline=5, lastline=10]{tex}{"./lst/mints_n iptest.tex.01"}
% \separator \par
% Now a Second Snippet of same files. \par
% \separator
% \inputminted[firstline=10, lastline=15]{tex}{"./lst/mintsn_iptest.tex.01"}
% \separator
% \inputminted[firstline=10, lastline=15]{tex}{"./lst/mints niptest.tex.01"}
% \separator
% \inputminted[firstline=10, lastline=15]{tex}{"./lst/mints n_iptest.tex.01"}
% \separator
% \inputminted[firstline=10, lastline=15]{tex}{"./lst/mints_n iptest.tex.01"}
% \separator
The above code DOES NOT work WITHOUT the "". --- > No problems Here.
Now with TColorbox.
\textbf{ENSURE minted cache is CLEARED...}. Delete the directory \_minted-project.
Add/Remove double quotes on file names to see different behaviors.
\setCode[firstline=5, lastline=10]{./lst/sn_iptest.tex.01}{UND. Only: CANNOT Have quotes}{Code:1}
\setCode[firstline=5, lastline=10]{"./lst/s niptest.tex.01"}{SPACES: WITH Quotes-OK; WITHOUT-'tail' after first space printed in listing}{Code:2}
\setCode[firstline=5, lastline=10]{"./lst/s n_iptest.tex.01"}{Space-Underscore: MUST HAVE Quotes}{Code:3}
\setCode[firstline=5, lastline=10]{"./lst/s_n iptest.tex.01"}{Underscore-Space: WITH Quotes-OK; WITHOUT-'tail' after first space printed in listing}{Code:4}
Now a second snippet of same files.
\setCode[firstline=10, lastline=15]{"./lst/sn_iptest.tex.01"}{UND. Only: MAY have Quotes but Python Error on FIRST compile}{Code:1a}
\setCode[firstline=10, lastline=15]{./lst/s niptest.tex.01}{SPACES: WITH Quotes-Python Error on FIRST compile (but completes ok); WITHOUT-'tail' after first space printed in listing}{Code:2a}
\setCode[firstline=10, lastline=15]{"./lst/s n_iptest.tex.01"}{Space-Underscore: MUST HAVE Quotes, BUT Python Error on FIRST compile (but completes ok)}{Code:3a}
\setCode[firstline=10, lastline=15]{"./lst/s_n iptest.tex.01"}{Underscore-Space: WITH Quotes-Python Error on FIRST compile (but completes ok); WITHOUT-'tail' after first space printed in listing}{Code:4a}
End document Here.
\end{document}