
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 hyperref
Links 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 \chapter
Befehl:
\codecitep
Befehle positioniertVordie ersten \chapter
kompilieren gut, aber diesenachnicht.
Lösung:(Ja, die Lösung kommt vor der Frage!) Wie inLaTeX-Fehler kann nicht gefunden werden, das Zurücksetzen \do
der Definition nach dem fehlerverursachenden Befehl sorgt dafür, dass die Kompilierung funktioniert.
\def\do{}
Das Hinzufügen nach jedem Befehl ist jedoch \chapter
viel zu schmutzig und ich glaube nicht, dass das Neudefinieren/Patchen des KOMA- \chapter
Befehls mit \def\do{}
dem Suffix „as“ eine nachhaltige Lösung ist.
Frage:Was macht eine \chapter
Änderung \do
aus und wie vermeide ich, dass sie sich auf mein eigenes \codecitep
Makro 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.sty
verwendete 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 \do
laut LaTeX nicht definiert ist.
Tatsächlich verschwindet das Problem, wenn ich \let\do\relax
die 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
\do
wird in vielen Low-Level-Latex-Konstrukten verwendet, nur durchsehen latex.ltx
gibt es
\global\let\do\noexpand
In\begin{document}
\let\do\@makeother
Und
\let\do\do@noligs
in verbatim
und\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 \do
Ausführung der getrennten Liste verwendet werden.