Manchmal habe ich in abgesetzten Formeln mehrere kleine Text-Teile, oder beispielsweise ein array mit Zahlenwerten und mathematischen Ausdrücken, wo eine Zeile (Titelzeile) oder eine Spalte Text enthält. Dafür verwende ich natürlich \text von amsmath, doch wird es viel Schreiberei und sieht redundant aus, wenn ich \text{...} & \text{...} & \text{...} schreibe.

Lässt sich das abkürzen? Zum Beispiel durch dezente backticks ` ... `, die im Mathemodus Text einleiten und beenden? Das wären Kürzel für "inline text" analog zu "inline math", was man ja mit $...$ oder \( ... \) macht.

gefragt 03 Jul '13, 20:02

jan12's gravatar image

jan12
770272732
Akzeptiert-Rate: 100%

bearbeitet 03 Jul '13, 20:47

saputello's gravatar image

saputello
11.1k174365

@jan12 Nachdem ich Dich gerade lobte, darf ich hoffentlich darauf hinweisen, dass hier ein VM zum Testen ganz nützlich gewesen wäre. So musst Du Dich mit meinem wenig phantasievollen zufrieden geben.

(03 Jul '13, 20:40) saputello

Das ist tatsächlich möglich, indem man ` zu einem aktiven Zeichen macht. Aktive Zeichen sind quasi Befehle, die nur aus einem Zeichen ohne vorngestellten Backslash (oder genauer: ohne vorangestelltes Escape-Zeichen) bestehen. Man muss nicht einmal ` generell zu einem aktiven Zeichen machen. TeX bietet nämlich die Möglichkeit, Zeichen auch nur im Mathemodus aktiv zu machen, indem man ihnen den Mathematik-Code "8000 (=32768) gibt:

\documentclass{article}
\usepackage{amsmath}
\mathcode`\`="8000 % mache ` zu einem aktiven Zeichen im Mathemodus
\begingroup
  \uccode`\~`\`
  \uppercase{%
\endgroup
  \def~#1`{\text{#1}}}
\begin{document}
\begin{align}
 a&=`Testtext` \\
 b&=`Testtext mit {`Hochkomma'}`\\
 c&=`{Ebenfalls mit `Hochkomma`}`
\end{align}
\end{document}

Der Weg über \uccode und \uppercase ist dabei ein gängiger Trick, der auch im TeXbook beschrieben wird und der notwendig ist, weil ` ja im Textmodus, in dem die Definition eigentlich stattfindet, gar nicht aktiv ist, also eigentlich nicht als Anweisung definiert werden kann.

Das Beispiel zeigt auch wie man ` innerhalb des Textes trotzdem verwenden kann, indem man entweder Gruppenklammern (Fall b) oder Argumentklammern (Fall c) verwendet. Es ist zu beachten, dass das \endgroup hier im Argument von \uppercase steht und das Argument bis nach der Definition von ~ reicht. Grob umrissen wird dabei ~ aufgrund der \uccode-Änderung am Anfang der Gruppe von \uppercase durch das (aktive) ` ersetzt.

Außerdem wird eine Definition mit einem sogenannten begrenzten Argument verwendet. Dabei wird das Argument nicht (zwingend) durch Argumentklammern begrenzt, sondern durch Zeichen im Argumentdeklarationsteil der Definition. Im Beispiel ist das begrenzende Zeichen wiederum ein `. Übrigens sind optionale Argumente in LaTeX ebenfalls über ein begrenztes Argument definiert. Dabei wird [ als vordere und ] als hintere Grenze verwendet. Deshalb muss man für ein ] in einem optionalen Argument auch denselben Trick verwenden, den ich oben verwendet habe, um ein ` innerhalb des Textes verwenden zu können.

In einem Kommentar habe ich skizziert, dass es für die Darstellung im Editor eventuell besser wäre, ein aktives Zeichen mit regulärem Argument zu definieren. Allerdings ist das dafür von mir ins Spiel gebrachte Zeichen § nicht wirklich gut geeignet. Da es von der Eingabecodierung abhängig ist, ob dies ein reguläres Zeichen ist oder nicht, funktioniert das folgende Beispiel nicht mehr, wenn man bei inputenc die Option in utf8 ändert (und die Datei auch in dieser Codierung speichert):

\documentclass{article}
\usepackage{amsmath}
\usepackage[latin1]{inputenc}% Mit utf8 funktioniert das Beispiel nicht!!!
\mathcode`\§="8000 % mache ` zu einem aktiven Zeichen im Mathemodus
\begingroup
  \uccode`\~`\§
  \uppercase{%
\endgroup
  \def~#1{\text{#1}}}
\begin{document}
\begin{align}
 a&=§{Testtext} \\
 b&=§{Testtext mit \S}\\
 c&=\mathsection §{ links mit mathematischem \S}
\end{align}
\end{document}

Kein Problem gibt es hingegen bei Verwendung von lualatex oder xelatex mit der nativen UTF-8-Eingabe, weil dabei das § ebenfalls ein reguläres Zeichen ist. Dann können sogar die \S im Beispiel durch § ersetzt werden.

Aus diesen Gründen würde ich tatsächlich die von @jan12 in der Frage vorgeschlagene Lösung mit `text` als die bessere Variante bezeichnen.

Permanenter link

beantwortet 03 Jul '13, 20:37

saputello's gravatar image

saputello
11.1k174365
Akzeptiert-Rate: 51%

bearbeitet 04 Jul '13, 08:16

@saputello Würdest du dieses Vorgehen allgemein anraten (im Sinne von »best practice«) oder als selten zu benutzenden Spezialfall einordnen? Auch ich fand das definieren von \text{keineVariable} immer lästig, bin aber nie auf die Idee der Definition eines »Shorthands« gekommen.

(03 Jul '13, 20:55) Johannes

@Johannes Ich selbst würde es nicht machen, aber weniger aus teXnische Gründen, sondern strategischen. Bei \text{…} weiß ich nämlich sofort woran ich bin und finde auch das Ende des Arguments sehr schnell. Mit ` wird es IMHO schnell unübersichtlich. Auch der Klammercheck und das Springen zum Anfang oder Ende des Arguments funktioniert in meinem Editor dann nicht mehr, ohne dass ich zusätzlich eingreife. Ich arbeite gerne mit eher wenigen Spezialeinstellungen, damit ich mich am Rechner des Kollegen nicht dauernd vertue. Ich muss aber auch nur C-c C-m te RET für \text{} drücken.

(03 Jul '13, 21:11) saputello

Danke für die Antwort, C-c C-m te RET kommt für mich als vim-Nutzer aber nicht in Frage :- )

(03 Jul '13, 21:16) Johannes

@Johannes Du kannst Dir aber bestimmt so etwas wie `t definieren … ;)

(03 Jul '13, 21:28) saputello

Ich könnte mir viel definieren, aber Editor-unabhängig wollte ich deine Meinung wissen. Best-TeX-Practice ist (zumindest in meinem Kopf) unabhängig vom Editor.

(03 Jul '13, 23:19) Johannes

@Johannes: Meine Meinung ist, dass es gute TeX-Tradition ist, sich Markup-Befehle, die man benötigt zu definieren. Da es bei TeX – die Unicode-Varianten einmal unbeachtet – nur 256 Zeichen gibt, von denen ein guter Teil auf Buchstaben, Ziffern und andere normale Zeichen entfällt, haben aktive Zeichen immer ein gewisses Potential, Probleme zu bereiten. Begrenzte Argumente sind auch nicht immer ganz unproblematisch. Daher vielleicht lieber §{…} definieren? Beim § sind Konflikte im Mathemodus eher unwahrscheinlich. Aber vielleicht kommt ein anderer auch ausgerechnet auf diesen Gedanken …

(04 Jul '13, 00:01) saputello

Aus purer Unwissenheit: könnest du §{…} bitte näher ausführen? Eventuell in einem neuen Frage/Antwort-Spiel?

(04 Jul '13, 00:16) Johannes

@saputello Danke für die tolle Lösung! Beim googlen habe ich jetzt noch analoges in der UK TeX FAQ gefunden: Defining characters as macros. Dort wird \lccode und \lowercase statt \uccode und \uppercase verwendet. Ist das ein erwähnenswerter Unterschied? Wenn ja, könnte ich das natl. als Frage posten.

(04 Jul '13, 16:14) jan12

@jan12 Nö, das ist sozusagen das gleiche in grün. Mit \lccode setzt man den lower case code eines Zeichens mit \uccode den upper case code. Mit \lowercase wandelt man ein Argment in Kleinbuchstaben, mit \uppercase in Gruoßbuchstaben. Also ist das Grundprinzip nicht nur das gleiche, sondern fast (aber eben nur fast) schon dasselbe.

(04 Jul '13, 17:05) saputello
Ergebnis 5 von 9 show 4 more comments
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:

×76
×52
×38

gestellte Frage: 03 Jul '13, 20:02

Frage wurde gesehen: 16,588 Mal

zuletzt geändert: 04 Jul '13, 17:05