插入多个 \newtcbinputlisting 设置时出现无限循环错误

插入多个 \newtcbinputlisting 设置时出现无限循环错误

我尝试生成不同编程语言的代码片段来突出显示不同编程语言中的不同语法,例如:Python、Matlab 和 C++(稍后会添加更多内容)。

在下面给出的代码中,我收到错误:

! TeX capacity exceeded, sorry [input stack size=5000]. \cl@chapter ->\cl@chapter \@elt {matlab} l.73 ...code,number within=chapter]{\inputcppcode} [3][]{listing options={lan...

你能告诉我如何消除此错误以使我的文件正确编译吗?

谢谢。

代码

\documentclass[a4paper, 10pt, oneside, fleqn, openright]{article}
\usepackage[no-math]{fontspec}

\usepackage{polyglossia}
\setdefaultlanguage{french}
\setotherlanguages{english}

\newcommand{\codeimg}{$\vcenter{\hbox{\includegraphics[height=\baselineskip]{example-image-a}}}$}
\newcommand{\codeimgpy}{$\vcenter{\hbox{\includegraphics[height=\baselineskip]{example-image-b}}}$}
\newcommand{\codeimgcpp}{$\vcenter{\hbox{\includegraphics[height=\baselineskip]{example-image-c}}}$}

\usepackage{calc}
\usepackage[usenames,dvipsnames,svgnames,table]{xcolor}
\usepackage{pdfpages,graphicx}
\usepackage{mdframed}
\usepackage{listings}
\usepackage{filecontents}
\definecolor{light-gray}{gray}{0.92}

\definecolor{mainColor}{RGB}{211, 47, 47} % some dark red

\renewcommand\lstlistingname{Code}
\lstset{
    language=Python,
    numbers=left,
    numbersep= 7mm,
    numberstyle=\color{Black},
    stepnumber=1,
    tabsize=3,
    breakatwhitespace=false,
    breaklines=true,
    captionpos=b,
    basicstyle=\color{Black}\ttfamily,
    commentstyle=\color{LimeGreen},
    keywordstyle=\color{BurntOrange}\bfseries,
    stringstyle=\color{WildStrawberry},
    keywords={var, func, extends},
    frame=leftline,
    framesep=0mm,
    xleftmargin=3mm,% marge ajouté à gauche du tableau (à configurer en dernier pour l'alignement global du tableau)
    framesep=2mm, %distance texte bord du cadre (limite de la background color)
    framerule=0mm,
    abovecaptionskip=5mm,
    aboveskip=\baselineskip,
    belowskip=\baselineskip
}

\usepackage{tcolorbox}
\newcounter{data}
\newcounter{result}
\newcounter{pythoncode}
\newcounter{cppcode}
\newcounter{matlab}
\tcbuselibrary{skins,breakable,listings}
\newtcblisting[use counter=lstlisting]{codeblock}[2][]{%
        enhanced,noparskip,breakable,colback=light-gray,colframe=DarkSlateGray,opacitybacktitle=.8,%
        fonttitle=\bfseries,before upper={\hspace*{-1em}\codeimgpy~#2},%
        title after break={\centering\footnotesize\itshape\strut\lstlistingname~\thelstlisting~--~continued},%
        listing only,listing options={xleftmargin=-1mm},
        after upper={\centering\strut\lstlistingname~\thelstlisting:~#2},
        frame hidden,arc=0pt,outer arc=0pt,boxrule=0pt,frame code={\draw[gray,line width=2mm] ([xshift=-0.5pt]frame.north west) -- ([xshift=-0.5pt]frame.south west);},#1}

\newtcbinputlisting[use counter=matlab,list inside=matlab,number within=chapter]{\inputmatlab}[3][]{listing options={style=Matlab-editor},%
        enhanced,noparskip,breakable,colback=light-gray,colframe=DarkSlateGray,opacitybacktitle=.8,%
        fonttitle=\bfseries,before upper={\hspace*{-1em}\codeimg~#2},%
    title after break={\centering\footnotesize\itshape\strut Matlab Code~\thematlab~--~continued},%
     listing only,listing options={xleftmargin=-1mm,#1,style=Matlab-editor},
     after upper={\centering\strut {\bfseries Matlab Code~\thematlab:}~#2},
     frame hidden,arc=0pt,outer arc=0pt,boxrule=0pt,
     %
     listing file={#3},#1}

\newtcbinputlisting[use counter=cppcode,list inside=cppcode,number within=chapter]{\inputcppcode}[3][]{listing options={language=C++},%
        enhanced,noparskip,breakable,colback=light-gray,colframe=DarkSlateGray,opacitybacktitle=.8,%
        fonttitle=\bfseries,before upper={\hspace*{-1em}\codeimgcpp~#2},%
    title after break={\centering\footnotesize\itshape\strut C++ Code~\thecppcode~--~continued},%
     listing only,listing options={xleftmargin=-1mm,#1,language=C++},
     after upper={\centering\strut {\bfseries C++ Code~\thecppcode:}~#2},
     frame hidden,arc=0pt,outer arc=0pt,boxrule=0pt,
     %
     listing file={#3},#1}

\usepackage[numbered,framed]{matlab-prettifier}

\begin{filecontents*}{sample.m}
% create a file for output
!touch testFile.txt
fid = fopen('testFile.text', 'w')
for i=1:10
  fprintf(fid,'%6.2f \n', i);
end
\end{filecontents*}

\begin{document}

\begin{codeblock}{Les bases de GDScript}
var nombreDeGardes = 4 #déclaration d'une variable
nombreDeGardes = plusDeux(nombreDeGardes) #appel d'une fonction avec la variable nombreDeGardes passée en paramètre

func maFonction(): #cette ligne déclare une nouvelle fonction nommée maFonction
    var variable1 = 7 #nouvelle variable dont la valeur est 7
    variable2 = ['un', 'deux', 'trois'] #variable assignée à un tableau contenant trois chaines de caractères

func plusDeux(argument1):
    return argument1 + 2
\end{codeblock}

\inputmatlab{Expansion Algorithm}{sample.m}

% https://www.programiz.com/cpp-programming/examples/add-numbers
\inputcppcode{Example C++ Code}{cppcodex.cpp}

\end{document} 

答案1

有问题的代码是numberwithin=chapter定义中的。article文档类没有计数器,chapter因为它没有\chapters,因此重置chapter不是一个真正定义明确的概念。

可以使用以下命令重现相同的问题

\documentclass{article}
\usepackage{tcolorbox}
\tcbuselibrary{listings}
\newcounter{a}
\newcounter{b}

\newtcbinputlisting[use counter=a, number within=chapter]{\inputverba}[1]{listing file={#1}}
\newtcbinputlisting[use counter=b, number within=chapter]{\inputverbb}[1]{listing file={#1}}

\usepackage{filecontents}
\begin{filecontents*}{sample.x}
Lorem
\end{filecontents*}

\begin{document}
\inputverba{sample.x}
\inputverbb{sample.x}
\end{document} 

number within并最终追溯到

\documentclass{article}
\newcounter{a}
\newcounter{b}

\makeatletter
\@addtoreset{a}{chapter}%
\@addtoreset{b}{chapter}%
\makeatletter

\begin{document}
Lorem
\end{document} 

当您想要\@addtoreset第二次访问一个不存在的计数器时就会发生此错误。

顺便说一句,\@removefromreset这里有一些错误检查,根据source2e(第 147 页,文件 m)

即使这是内部的,程序员也应该知道他/她在做什么,我们在这里测试计数器是否#2被定义。

但没有进行这样的错误检查\@addtoreset

解决方案是选择一个现有的计数器进行重置,即number within=section,或者使用带有\chapters的文档类,即reportbook

相关内容