Innerhalb eines komplexeren Befehls benötige ich die expl3-Syntax. Im folgenden Beispiel wird der Ausdruck, der im mathematischen Modus unter der Unterklammer stehen soll, stattdessen dahinter gesetzt, da offenbar der Unterstrich nicht wie gewünscht interpretiert wird. Ich weiß, dass der Unterstrich innerhalb der expl3-Syntax eine geänderte Bedeutung hat, jedoch nicht, wie ich ihm seine ursprüngliche Bedeutung wiedergeben kann.

Open in Online-Editor
\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand \Unterklammer {m m}
    {
        \underbrace{#1}_{#2}
    }

\ExplSyntaxOff

\begin{document}
Direkt eingegebener mathematischer Ausdruck mit Unterklammer:
\[\underbrace{x^2+4}_{f(x)}\]
Mittels xparse-Befehl eingegebener mathematischer Ausdurck mit Unterklammer:
\[\Unterklammer{x^2+4}{f(x)}\]
\end{document}

Das Minimalbeispiel funktioniert zwar, wenn \ExplSyntaxOn und \ExplSyntaxOff auskommentiert werden, jedoch werden diese Befehle im realen Zusammenhang benötigt.

gefragt 22 Mär '16, 13:48

Cletus's gravatar image

Cletus
1.6k75866
Akzeptiert-Rate: 75%


Ich würde gar nicht versuchen, dem Unterstrich wieder seine „ursprüngliche“ Bedeutung (also Kategorie-Code 8) zu geben, sondern auf die verfügbaren Alternativen zugreifen. LaTeX definiert (in latex.ltx)

Open in Online-Editor
\let\sp=^
\let\sb=_

was bedeutet, dass man in Makros jederzeit auf \sb bzw. \sp zurückgreifen kann. expl3 hat für beide Token auch generische Tokens:

Open in Online-Editor
\c_math_superscript_token
\c_math_subscript_token

Beide Alternativen dürften in Deinem Fall funktionieren:

Open in Online-Editor
\documentclass{article}

\usepackage{expl3,xparse}

\ExplSyntaxOn
\cs_new:Npn \my_math_command:nn #1#2
  { {#1} \sb {#2} }

\cs_new:Npn \my_other_math_command:nn #1#2
  { {#1} \c_math_subscript_token {#2} }

\NewDocumentCommand \mathone {mm}
  { \my_math_command:nn {#1} {#2} }

\NewDocumentCommand \mathtwo {mm}
  { \my_other_math_command:nn {#1} {#2} }
\ExplSyntaxOff

\begin{document}

$\mathone{a}{b}$

$\mathtwo{a}{b}$

\end{document}

PS: beachte, dass ich im Beispiel auf die in l3 erwünschte Trennung von Dokumentenebene und Codeebene Rücksicht genommen habe. Das heißt hier konkret: für jeden Befehl auf Dokumentenebene gibt es eine entsprechende Funktion der Codeebene, mit der der Dokumentenbefehl definiert wird.

Permanenter link

beantwortet 22 Mär '16, 19:50

cgnieder's gravatar image

cgnieder
22.1k253463
Akzeptiert-Rate: 60%

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×13
×7
×6

gestellte Frage: 22 Mär '16, 13:48

Frage wurde gesehen: 6,746 Mal

zuletzt geändert: 22 Mär '16, 19:50