Ich möchte \renewcommand{\%}{\textsf{\%}}. Das wird nicht akzeptiert. Gibt es eine Möglichkeit, sowas zu tun?

Open in Online-Editor
\documentclass[border=5pt, varwidth]{standalone}
%\documentclass[ngerman]{scrartcl}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\usepackage{amsmath, amsfonts, amssymb, relsize}

\renewcommand{\%}{\textsf{\%}}

\begin{document}
      $3\%$
\end{document}

gefragt 06 Jul '16, 15:02

cis's gravatar image

cis
9.5k92459491
Akzeptiert-Rate: 29%

bearbeitet 06 Jul '16, 15:43

saputello's gravatar image

saputello
11.1k174365


Das ist ein typischer Rekursionsfehler. TeX ist eine Makrosprache, das heißt, dass bei der Expansion einer Anweisung dessen Definition eingesetzt und dann expandiert wird. Nach der Expansion von \% zu \textsf{\%} in Deinem Beispiel würde dann erneut \% expandiert und zwar mit der Definition, die es zum Zeitpunkt der Expansion hat, also wieder \textsf{\%}. Das \% darin würde erneut mit der zu diesem Zeitpunkt gültigen Definition expandiert und immer so weiter. Das führt theoretisch zu einer unendlichen Rekursion, die TeX jedoch nach einiger Zeit erkennt und dann mit Fehlermeldung abbricht. Normalerweise müsste man nun zunächst einem Hilfsmakro die ursprüngliche Bedeutung von \% zuweisen, um dieses Hilfsmakros in der neuen Definition zu verwenden. Da es ein solches Makro im Fall von \% aber bereits gibt, ist die Lösung einfach:

Open in Online-Editor
\documentclass[border=5pt, varwidth]{standalone}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\renewcommand*{\%}{\textsf{\csname @percentchar\endcsname}}

\begin{document}
      $3\%$
\end{document}

Ohne das Wissen, um das LaTeX-interne \@percentchar oder wenn nicht sicher ist, dass \% dem entspricht, könnte man beispielsweise

Open in Online-Editor
\documentclass[border=5pt, varwidth]{standalone}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\newcommand*{\percent}{}% Hilfsmakro reservieren
\let\percent\%% Hilfsmakro die ursprüngliche Bedeutung von \% zuweisen
\renewcommand*{\%}{\textsf{\percent}}% \% unter Verwendung des Hilfsmakros umdefinieren

\begin{document}
      $3\%$
\end{document}

verwenden.

Für die Änderung echter Makros (\% aus dem LaTeX-Kern ist tatsächlich ein Character-Token und kein echtes Makro, ein solches wird es erst durch die Umdefinierung) sei hingegen auf Pakete wie xpatch hingewiesen. Damit ist ein Hilfsmakro oft überflüssig.

Permanenter link

beantwortet 06 Jul '16, 15:19

saputello's gravatar image

saputello
11.1k174365
Akzeptiert-Rate: 51%

bearbeitet 06 Jul '16, 15:42

Ohhh, \let und LaTeX sind keine guten Freunde (z.B. bei \DeclareRobustCommand oder mit optionalen Argumenten). Vielleicht möchtest du noch kurz letltxmacro erwähnen.

(06 Jul '16, 16:49) Henri

@Henri: \let ist im gezeigten Fall vollkommen unproblematisch.

(06 Jul '16, 18:05) saputello
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:

×52
×20
×18
×2

gestellte Frage: 06 Jul '16, 15:02

Frage wurde gesehen: 6,278 Mal

zuletzt geändert: 06 Jul '16, 18:05