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, 09:02

cis's gravatar image

cis
5.4k860169
Akzeptiert: 68%

bearbeitet 06 Jul, 09:43

saputello's gravatar image

saputello
18.4k22352


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, 09:19

saputello's gravatar image

saputello
18.4k22352

bearbeitet 06 Jul, 09: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, 10:49) Henri

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

(06 Jul, 12:05) saputello
Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

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üge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×45
×19
×15
×1

Frage gestellt: 06 Jul, 09:02

Frage wurde angeschaut: 283 Mal

Zuletzt aktualisiert: 06 Jul, 12:05