Das Hinzufügen von \chapter in KOMA scrbook erzeugt einen „! LaTeX-Fehler: \do nicht definiert.“

Das Hinzufügen von \chapter in KOMA scrbook erzeugt einen „! LaTeX-Fehler: \do nicht definiert.“

Kontext:Diese Frage ist eine Folgefrage vonUmgang mit _ (Unterstrichen) in einer durch Kommas getrennten Argumentliste eines Makros. In dieser Frage erstelle ich das Makro \codecitep, das eine durch Kommas getrennte Liste als Argument verwendet und diese Schlüssel druckt und hyperrefLinks generiert.

Problem:Mein MWE funktioniert einwandfrei, allerdings ist es mir nicht gelungen, es in mein echtes Dokument zu implementieren. Ich erhalte tatsächlich die folgende Fehlermeldung:

! LaTeX Error: \do undefined.

Ich habe die Ursache gefunden, nämlich ... den \chapterBefehl: \codecitepBefehle positioniertVordie ersten \chapterkompilieren gut, aber diesenachnicht.

Lösung:(Ja, die Lösung kommt vor der Frage!) Wie inLaTeX-Fehler kann nicht gefunden werden, das Zurücksetzen \doder Definition nach dem fehlerverursachenden Befehl sorgt dafür, dass die Kompilierung funktioniert.

\def\do{}Das Hinzufügen nach jedem Befehl ist jedoch \chapterviel zu schmutzig und ich glaube nicht, dass das Neudefinieren/Patchen des KOMA- \chapterBefehls mit \def\do{}dem Suffix „as“ eine nachhaltige Lösung ist.

Frage:Was macht eine \chapterÄnderung \doaus und wie vermeide ich, dass sie sich auf mein eigenes \codecitepMakro auswirkt?


\documentclass{scrbook}
    \usepackage{etoolbox}
    \usepackage{hyperref}
    \usepackage{lipsum}

    \newcommand{\codecitep}[1]{% cf. https://tex.stackexchange.com/a/87423/64454
        [%
        \def\nextitem{\def\nextitem{, }}% Separator
        \renewcommand*{\do}[1]{\nextitem{\hyperref[code:##1]{##1}}}% How to process each item
        \docsvlist{#1}% Process list
        ]%
    }   
\begin{document}

    \section{Body before chapter}
        A sentence with one code-citation only \codecitep{key1}.
        Another sentence with two code-citations and followed by dummy text \codecitep{key1, key2}.

\chapter{Chapter title}
%\def\do{}% <----- uncomment to make the error disappear
    \section{Body after chapter}
        A sentence with one code-citation only \codecitep{key1}.
        Another sentence with two code-citations and followed by dummy text \codecitep{key1, key2}.
        \lipsum[1-2]

    \section{Appendix}
        \lipsum[3]

        \subsection{key1}
        \label{code:key1}
        \label{code:a_123}
        \lipsum[4]

        \subsection{key2}
        \label{code:key2}
        \label{code:bb_456}
        \lipsum[5]
\end{document}

Antwort1

Das von tocbasic.styverwendete Paketscrbook

\let\do\relax

als Teil von \doforeachtocfile, das von ausgeführt wird \chapter. Das bedeutet, dass Sie nicht ausführen können \renewcommand\do{...}, da \dolaut LaTeX nicht definiert ist.

Tatsächlich verschwindet das Problem, wenn ich \let\do\relaxdie beiden internen Makros entferne, die dies tun.

Das \renewcommand{\do}{...}Problem ist auch in anderen Situationen aufgetreten. Meiner Meinung nach ist es am besten, einen eigenen Listenprozessor zu verwenden.

\documentclass{scrbook}

\usepackage{etoolbox}
\usepackage{hyperref}
\usepackage{lipsum}

\newcommand{\codecitep}[1]{% cf. https://tex.stackexchange.com/a/87423/64454
  [%
  \def\nextitem{\def\nextitem{, }}% Separator
  \forcsvlist\codecitepitem{#1}% Process list
  ]%
}
\newcommand{\codecitepitem}[1]{%
  \nextitem
  \hyperref[code:#1]{\detokenize{#1}}%
}

\begin{document}

\section{Body before chapter}

A sentence with one code-citation only \codecitep{key1}.
Another sentence with two code-citations and followed by 
dummy text \codecitep{key1, key2}.

\chapter{Chapter title}

\section{Body after chapter}

A sentence with one code-citation only \codecitep{key1}.
Another sentence with two code-citations and followed by 
dummy text \codecitep{key1, key2}.
\lipsum[1-2]

\section{Appendix}

\lipsum[3]

\subsection{key1}

\label{code:key1}
\label{code:a_123}
\lipsum[4]

\subsection{key2}
\label{code:key2}
\label{code:bb_456}
\lipsum[5]

\end{document}

Antwort2

\dowird in vielen Low-Level-Latex-Konstrukten verwendet, nur durchsehen latex.ltxgibt es

 \global\let\do\noexpand

In\begin{document}

  \let\do\@makeother 

Und

\let\do\do@noligs

in verbatimund\verb

\let\do\@makeother

Infilecontents

Ich habe nicht genau herausgefunden, was es in Ihrem Anwendungsfall zurücksetzt, aber grundsätzlich sollte es immer nur für eine lokale Definition unmittelbar vor der \doAusführung der getrennten Liste verwendet werden.

verwandte Informationen