Ausgehend von der Antwort von Clemens auf diese Frage würde ich gerne wissen, warum das folgende Beispiel den Fehler
liefert und wie man den Fehler beheben kann. Open in Online-Editor
\documentclass[12pt]{beamer} \usepackage{libertine} \usepackage[libertine,liby,slantedGreek]{newtxmath} \usepackage{dsfont} \usepackage{etoolbox,letltxmacro} \LetLtxMacro\savedmathds\mathds \newcommand*\vdssets{} \forcsvlist{\listadd\vdssets}{N,Q,R} \renewcommand*\mathds[1]{% \ifinlist{#1}{\vdssets} {\savedmathds{#1}} {#1}% } \begin{document} \[ 1\in \mathds{N} \subset \mathds{Z} \subset \mathds{Q} \subset \mathds{R} \] \end{document} Ziel ist es, dass Update: Wenn ich gefragt 05 Mär '16, 19:50 tom75 |
Die Fehlermeldung ist einer der typischen beim Zerbrechen eines Befehls bei der Expansion. In der Tat hilft es hier auch, den Befehl Open in Online-Editor
\documentclass[12pt]{beamer} \usepackage{libertine} \usepackage[libertine,liby,slantedGreek]{newtxmath} \usepackage{dsfont} \usepackage{etoolbox,letltxmacro} %\show\mathds \LetLtxMacro\savedmathds\mathds \newcommand*\vdssets{} \forcsvlist{\listadd\vdssets}{N,Q,R} \DeclareRobustCommand*\mathds[1]{% \ifinlist{#1}{\vdssets} {\savedmathds{#1}\relax} {#1}% } \begin{document} \[ %\expandafter\show\csname mathds \endcsname 1\in \mathds{N} \subset \mathds{Z} \subset \mathds{Q} \subset \mathds{R} \] \end{document} Die robuste Deklaration ist auch deshalb sinnvoll, weil der Befehl zuvor bereits robust war, und erst durch die Umdefinierung mit
Wann immer die \show\foo als Definition eines Makros \protect \foo . (man beachte die zwei Leerzeichen vor dem Punkt) ausgibt, handelt es sich um ein robust deklarierten Befehl.
Allerdings genügt in diesem Fall auch das nicht. Wir müssen nun also zusätzlich dafür sorgen, dass die Umdefinierung erst dann aktiv wird, wenn die Schrift bereits geladen wurde. Die Schrift wird spätestens dann geladen, wenn sie das erste Mal verwendet wird. Um genau dafür zu sorgen, können wir beispielsweise mit Open in Online-Editor
\documentclass[12pt]{beamer} \usepackage{libertine} \usepackage[libertine,liby,slantedGreek]{newtxmath} \usepackage{dsfont} \usepackage{etoolbox,letltxmacro} % \show\mathds% Erkennung von \protect-Definition % \expandafter\show\csname mathds \endcsname% Erkennung der eigentlichen Definition \newcommand*\vdssets{} \forcsvlist{\listadd\vdssets}{N,Q,R} \makeatletter \AtBeginDocument{% warten bis LaTeX das Font-System initialisiert hat \sbox\@tempboxa{$\mathds{}$}% Schrift laden und damit \mathds endgültig definieren \LetLtxMacro\savedmathds\mathds% Definition übernehmen \DeclareRobustCommand*{\mathds}[1]{% neu (und erneut robust) definieren \ifinlist{#1}{\vdssets}% {\savedmathds{#1}}% {#1}% } } \makeatother \begin{document} \[ % \expandafter\show\csname mathds \endcsname% Erneute Erkennung der eigentlichen Definition 1\in \mathds{N} \subset \mathds{Z} \subset \mathds{Q} \subset \mathds{R} \] \end{document} Das führt dann auch wie erwartet zu Tatsächlich würde es jetzt auf den ersten Blick sogar genügen, beantwortet 06 Mär '16, 09:49 saputello Vielen Dank für die Erklärung. Das Ergebnis passt aber noch nicht, denn das Z wird nach wie vor mit Doppelstrich gedruckt.
(06 Mär '16, 11:02)
tom75
Ja, das Ganze ist noch viel schlimmer als ich dachte. Siehe meine erweiterte Antwort.
(06 Mär '16, 12:31)
saputello
Das klingt kompliziert. Warum geht es mit
(06 Mär '16, 13:36)
tom75
@tom75: Weil dann
(06 Mär '16, 15:06)
saputello
@saputello: Welche Variante ist die sauberere? Deine Lösung oder einfach
(06 Mär '16, 15:09)
tom75
Ergebnis 5 von 6
show 1 more comments
|