Titletoc + multitoc : \@starttoc 上的冲突

Titletoc + multitoc : \@starttoc 上的冲突

我在使用 titletoc 和 multitoc 时遇到了一个麻烦的问题。简而言之,代码如下所示:

分数维:

\documentclass{report}
\usepackage{listings}
\usepackage{titletoc}
\usepackage[toc,page]{appendix}

\contentsuse{lstlisting}{lol}
\contentsuse{lstlisting}{apl}

\titlecontents{lstlisting}[2em]
              {\addvspace{0.25pc}}
              {\textbf{Code \thecontentslabel} }
              {}
              {\titlerule*[0.5em]{$\cdot$}\contentspage}
              []

\makeatletter

  \providecommand{\phantomsection}{}
  \newcommand\appendixlistingname{\lstlistlistingname}
  \newcommand{\listofappendixlistings}{%
  % Applying the same trick as listings does with \lstlistoflistings: Modifying \@starttoc such that it can load only .apl files
    \begingroup
      \let\@starttoc@orig\@starttoc%
      \renewcommand{\contentsname}{\appendixlistingname}
      \renewcommand{\@starttoc}[1]{%
        \@starttoc@orig{apl}%
      }%    
      \phantomsection
      \addcontentsline{toc}{section}{\appendixlistingname}
      \tableofcontents% Calling \tableofcontents with the `.apl` file instead of `.toc`
    \endgroup
  }

  \newcommand{\appendixFix}{%
  \setcounter{lstlisting}{0}%
  \@ifundefined{theHlstlisting}{%
    }{%
      \renewcommand{\theHlstlisting}{appendix}
    }%
  \write\@auxout{%
    \string\let\string\latex@tf@lol\string\tf@lol% Store the original `\tf@lol` file handle
    \string\let\string\tf@lol\string\tf@apl% 
  }%
}{}{}

\makeatother

% Backup
\let\backupCommand\lstlistoflistings
\let\backupCommandZ\listofappendixlistings

%\usepackage[toc]{multitoc}
%\renewcommand*{\multicolumntoc}{2}
%\setlength{\columnseprule}{0.5pt}

\begin{document}

\chapter{YOLO}

\backupCommand

\begin{lstlisting}[caption=Test]
Some code
\end{lstlisting}

\appendixFix

\begin{appendices}
    \backupCommandZ
    \begin{lstlisting}[caption=Test2]
        Some code
    \end{lstlisting}
\end{appendices}

\end{document}

如果没有 multitoc,它会为每个部分(主要部分和附录)生成一个列表:

在此处输入图片描述

在此处输入图片描述

但是当我取消注释 3 个 multitoc 行时,两个部分的列表都损坏了。

有什么解决办法吗?

谢谢

附言:我检查了存储参考资料的两个文件(主要的.lol,附录的apl)在编译后是否有预期的内容。

主要.lol

\defcounter {refsection}{0}\relax 
\contentsline {lstlisting}{\numberline {5.1}Exemple des fonctionnalités de Lodash}{30}{lstlisting.5.1}%
\defcounter {refsection}{0}\relax 
\contentsline {lstlisting}{\numberline {5.2}Axios : Exemple d'utilisation d'une POST request}{32}{lstlisting.5.2}%

主程序

\defcounter {refsection}{0}\relax 
\contentsline {lstlisting}{\numberline {B.1}{\ignorespaces \ignorespaces {Exemple d'une ressource information avec notre norme}\relax }}{97}{lstlisting.appendix}%
\defcounter {refsection}{0}\relax 
\contentsline {lstlisting}{\numberline {D.1}Point d'entrée d'une application, sur base de Yargs}{111}{lstlisting.appendix}%
\defcounter {refsection}{0}\relax 
\contentsline {lstlisting}{\numberline {D.2}Exemple d'une implémentation d'une commande "Yargs"}{111}{lstlisting.appendix}%
\defcounter {refsection}{0}\relax 
\contentsline {lstlisting}{\numberline {D.3}Implémentation de la recherche par \glspl {tag}}{112}{lstlisting.appendix}%

答案1

感谢 Ijon Tichy(来自 LaTeX.org),我知道了这个错误背后的原因:

几年前,我曾向软件包作者发送过一个错误报告,因为 multitoc 禁用了除 toc、lot 和 lof 之外的所有文件的 @starttoc。他回答说,他不再支持该软件包,并建议不要再使用它。

对于任何感兴趣的人,这是我的解决方案:

\usepackage{multicol}
\newcommand*{\multicolumntoc}{2}
\setlength{\columnseprule}{0.5pt}

\makeatletter

\newcommand\beautifultableofcontents{%
    \begin{multicols}{\multicolumntoc}[\section*{\contentsname
        \@mkboth{%
           \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}]%
    \@starttoc{toc}%
    \end{multicols}%
    }

\makeatother 

可以像这样调用:

\beautifultableofcontents

相关内容