PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : MakeUppercase in \newcommand mit \ifthenelse



ubunter
06-07-2012, 13:42
Hallo an alle,

folgender Code:


\documentclass{book}


\usepackage{xifthen}
\usepackage{xparse}
\usepackage[pdftex]{hyperref}
\usepackage{amsmath}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}

\begin{document}

\MakeUppercase{\ifthenelse{\isin{a}{a}}{x}{y}}

\end{document}

Das führt bei mir zu einer "TeX capacity exceeded"-Ausnahmefehler, was ich teilweise auch nachvollziehen kann.

Mein echtes Dokument ist natürlich viel komplexer und ich arbeite mit "newcommand". Im Endeffekt brauche ich in einem Kommando, das eine Zeichenkette in uppercase umwandelt:


\newcommand{ ... \MakeUppercase{#1} ... }

Das Problem ist, dass #1 in speziellen Fällen eben zu


\ifthenelse{\isin{a}{a}}{x}{y}

wird. Was ich bräucht wäre vermutlich irgendwas wie


\MakeUppercase{\bitte_latex_löse_argument_erst_ein mal_auf{#1}}

Gibt es sowas? Ich habe viel gegoogelt und auch Sachen mit "expand"-Thematik gefunden, aber eher Sachen, die in Zusammenhang mit "\def" funktionieren.

Danke und Gruß!

u_fischer
06-07-2012, 15:08
\ifthen ist nicht expandierbar und da \Makeuppercase intern ein \edef ausführt, wird es so nicht gehen. Du brauchst einen anderen Test, z.B. aus l3regex:


\documentclass{book}
\usepackage{l3regex}

\begin{document}
\ExplSyntaxOn
\MakeUppercase{\regex_match:nnTF { lu } { blub } { wahr } { falsch }}
\quad
\MakeUppercase{\regex_match:nnTF { la } { blub } { wahr } { falsch }}
\ExplSyntaxOff
\end{document}

ubunter
06-07-2012, 23:57
Danke für die neue Idee. Ein positiver Effekt ist außerdem, dass ich jetzt weiß, wie ich auch noch reguläre Ausdrücke verwenden kann.

Ansonsten habe ich vorhin weiterprobiert und doch eine Möglichkeit gefunden, allerdings mit dem "verpönten" \uppercase:


\uppercase{\expandafter{\ifthenelse{\isin{a}{a}}{x }{y}}}

Bisher scheint es genauso zu funktionieren, wie ich mir das wünsche. Ich traue dem Frieden aber nicht ganz...

u_fischer
07-07-2012, 17:43
Ansonsten habe ich vorhin weiterprobiert und doch eine Möglichkeit gefunden, allerdings mit dem "verpönten" \uppercase:


\uppercase{\expandafter{\ifthenelse{\isin{a}{a}}{x }{y}}}

Bisher scheint es genauso zu funktionieren, wie ich mir das wünsche. Ich traue dem Frieden aber nicht ganz...

Du brauchst das \expandafter hier nicht, (es tut auch nicht das, was du wahrscheinlich hoffst).

Der wesentliche Unterschied zwischen \uppercase und \Makeuppercase ist, dass \uppercase Befehle ignoriert und keine speziellen Dinge wie ß->SS kennt. Es tauscht einfach alle Buchstaben (inklusiver der mit aktiven catcode wie den Umlauten, wenn du inputenc lädst) durch den durch den \uccode bestimmten Großbuchstaben aus. Insbesondere wird es deine Testbedingungen verändern:


\documentclass{book}
\usepackage[T1]{fontenc}

\usepackage[latin1]{inputenc}
\usepackage{ifthen}
\begin{document}
\def\foo{Hallo}

\MakeUppercase{\foo, schöne Grüße}

\uppercase{\foo, schöne Grüße}

\uppercase\expandafter{\foo, schöne Grüße}

a=a:
\ifthenelse{\equal{a}{a}}{wahr}{falsch}
\uppercase{\expandafter{\ifthenelse{\equal{a}{a}}{ wahr}{falsch}}}
\uppercase{\ifthenelse{\equal{a}{a}}{wahr}{falsch} }

A=a:
\ifthenelse{\equal{A}{a}}{wahr}{falsch}
\uppercase{\expandafter{\ifthenelse{\equal{A}{a}}{ wahr}{falsch}}}
\uppercase{\ifthenelse{\equal{A}{a}}{wahr}{falsch} }
\end{document}


Grundsätzlich würde ich dir raten, dass mit dem Uppercase (wie auch immer) zu überdenken. Wenn deine Schrift es hergibt, würde ich eher Kapitälchen nutzen.