文件名中有空格和/或下划线时,tcolorbox tcblinputlisting 会出现意外行为

文件名中有空格和/或下划线时,tcolorbox tcblinputlisting 会出现意外行为

我不是 Latex 专家,因此在追踪这个问题时我已经达到了知识的极限。如果有人能解释一下这个问题,我认为这将非常有用。

问题描述(适用于 Windows,请参阅以下环境):当使用带有 minted 库的\newtcbinputlistingfrom\tcolorbox时,如果文件名有空格和/或下划线,最终结果和/或编译可能会失败或出现意外行为。如果使用单个或多个相同文件的片段,则问题会有所不同。我将介绍一些测试条件......但其他条件可能(可能)存在。

环境: 我正在运行 Windows 10 Education,64 位,版本 17134;MiKTeX:2.9.6930;minted 2.5;tcolorbox 4.15。

MWE 的设置: 要获得 MWE,请使用以下代码保存为最小.tex.然后使用以下批处理文件(见下文)创建所有必需的文件(它只是 minimal.tex 的多个副本)

如何运行并识别问题:

  1. (可选)使用\inputminted命令取消注释部分;使用命令注释部分\setCode1.a - 结果:您应该看到八个没有问题的列表。(我认为这可以确保问题不是来自 minted 包。您同意吗?)
  2. 重要的删除目录“_minted-minimal”(铸造的缓存)如果您运行步骤 1。
  3. 重要的\inputminted:如果运行步骤 1,请注释掉 ALL 。
  4. \setCode对代码 1a 至代码 4a(最后四个)的 注释。4.a - 结果:您应该看到四个列表,没有任何问题。 4.b——变体有问题:正如您在标题中看到的,使用或不使用双引号很重要……并且取决于文件名中是否存在空格/下划线。添加/删除双引号会改变结果。作为“一般”规则,带空格的文件名必须带引号,而没有空格的文件名不能带引号。(应该检查文件名是否有空格……并添加双引号?)
  5. 重要的删除目录“_minted-minimal”(生成的缓存)。这确保了下一个场景的“全新”开始:每个源文件有多个代码片段。
  6. 取消\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}

相关内容