使用 minted 库的 tcolorbox 的奇怪行为

使用 minted 库的 tcolorbox 的奇怪行为

我一直在苦苦思索如何排版一份包含一些代码示例的文档。经过几天的调查,我终于缩小了问题的范围。

这是序言(编辑:更短的代码):

\documentclass[11pt,a4paper]{book}
\usepackage[utf8]{inputenc}
\usepackage{tocloft}
\usepackage[most,listings,minted]{tcolorbox}
\usepackage[english]{babel}
\newtcblisting[auto counter,number within=chapter,list inside=loe]{cxmpl}[2]{listing engine=minted,minted language=#1,minted options={breaklines,autogobble,linenos,fontsize=\small,numbersep=3mm},title=\textbf{Code~\thetcbcounter:} #2}
\newtcbtheorem[use counter from=cxmpl,list inside=loe]{xmpl}{Example}{}{xmp}
\begin{document}
    \chapter{One}
        \begin{minted}{csharp}
int main() {printf("hello, world");return 0;}
        \end{minted}
        \begin{cxmpl}{csharp}{A different code}
int main() {printf("hello, northpole");return 0;}
        \end{cxmpl}
        \begin{xmpl}{An example}
            this is just an example
        \end{xmpl}
        \begin{minted}{csharp}
int main() {printf("hello, sun");return 0;}
        \end{minted}
        \begin{cxmpl}{csharp}{Some different code}
int main() {printf("hello, woods");return 0;}
        \end{cxmpl}
\end{document}

产生以下输出(没有错误):

在此处输入图片描述

在 1.2 中缺少“t”,并且 1.1 和 1.3 显示的代码不正确。

在没有 minted 环境的情况下排版相同的代码会产生以下输出:

![在此处输入图片描述

删除所有文件和文件夹后排版会产生以下错误和输出:

在此处输入图片描述

在此处输入图片描述

奇怪的是,控制台会针对每个cxmpl环境显示此消息。但它们不会显示在日志中:

Python was not found but can be installed from the Microsoft Store: https://go.microsoft.com/fwlink?linkID=2082640

Error: cannot read infile: [Errno 2] No such file or directory: 'test_pygments.pyg'

现在我很迷茫,因为我无法解释这个问题从何而来。

答案1

欢迎来到 TeX.SE,感谢您使您的示例更简短、更完整(您仍可以为了回答这个问题而删除一些包,但这是一个好的开始)。您的代码中有两个不相关的问题。

第一个问题与列表无关;您只是误用了xmp定义的环境\newtcbtheorem。此类环境采用额外的参数,用于定义由 生成的框的标签tcolorbox(与 和/tcb/label separator传递给 的第四个强制参数一起\newtcbtheorem)。请参阅图书馆定理在里面tcolorbox 手册(4.22 版第 350 页)。简而言之,您必须像xmp这样调用环境:

\begin{xmpl}{An example}{some-possibly-empty-label}
    this is just an example
\end{xmpl}

在您的情况下,您没有传递参数some-possibly-empty-label,因此xmpl环境抓取下一个标记作为参数,即t您情况下的字母。

第二个问题是,您在定义环境时没有listing only在选项中使用。因此,您的代码首先使用(逐字和彩色)进行排版,\newtcblistingcxmplminted然后也解释为下部的 LaTeX 代码tcolorbox(您注意到了水平虚线,对吧?它将上部与下部分开)。这就是为什么下部的括号消失的原因:对于标准类别代码制度下的 TeX,它们仅表示组的开始和组的结束;这不会导致括号的排版。默认设置非常适合 LaTeX 代码示例,在这些示例中,最好在代码旁边看到格式化的输出。对于其他语言,listing only通常更合适。

以下是修复了两个问题的代码:

\documentclass{book}
\usepackage{geometry}
\usepackage[listings, minted, theorems]{tcolorbox}

\newtcblisting[auto counter, number within=chapter, list inside=loe]{cxmpl}[2]{
  listing engine=minted, minted language={#1}, listing only,
  minted options={breaklines, autogobble, linenos, fontsize=\small,
                  numbersep=3mm},
  title={\textbf{Code~\thetcbcounter:} #2},
}

\newtcbtheorem[use counter from=cxmpl, list inside=loe]{xmpl}{Example}{}{xmp}

\begin{document}

\chapter{One}

  \begin{minted}{csharp}
int main() {printf("hello, world"); return 0;}
  \end{minted}

  \begin{cxmpl}{csharp}{A different code}
int main() {printf("hello, northpole"); return 0;}
  \end{cxmpl}

  \begin{xmpl}{An example}{some-possibly-empty-label}
      This is just an example.
  \end{xmpl}

  \begin{minted}{csharp}
int main() {printf("hello, sun"); return 0;}
  \end{minted}

  \begin{cxmpl}{csharp}{Some different code}
int main() {printf("hello, woods"); return 0;}
  \end{cxmpl}

\end{document}

在此处输入图片描述

答案2

因此,经过一些研究以及一些错误和尝试后,我找到了以下解决方案:

不知何故,尽管我手动将 python 目录添加到路径变量以及脚本的路径变量中,但命令提示符无法识别python(按下 Enter 并打开 Windows 商店后没有显示任何内容,这可以解释错误Python was not found but can be installed from the Microsoft Store: https://go.microsoft.com/fwlink?linkID=2082640)。奇怪的是,我能够安装并运行pippygments这也许可以解释为什么 minted 包运行良好

为了解决这个问题,我使用以下选项完全重新安装了 python:

在此处输入图片描述

然后将python结果输入

在此处输入图片描述

最后,我安装pygments并重新运行了 LaTeX,但仍然产生了错误的输出。

最后一个问题只是因为所有旧文件仍然存在。删除它们并重新运行 LaTeX 解决了这个问题。

在此处输入图片描述

希望这在未来也能对其他人有用。

相关内容