2009-04-01 9 views
3

Ich versuche einen LaTeX-Befehl mit zwei Argumenten zu erstellen, von denen einer optional ist. Normalerweise würde ich dies tun alsLaTeX: Wie verwende ich ein benötigtes Argument als Standard für ein optionales Argument?

\newcommand{\whatever}[2][default]{first #1 second #2} 

wo default den Standardwert für das erste Argument ist. Aber für diesen Befehl möchte ich der Wert des zweiten Arguments für das erste Argument als Standardwert verwendet werden - das heißt, ich will

\whatever{blah} 
\whatever{foo} 
\whatever[lol]{rofl} 

äquivalent zu

\whatever[blah]{blah} 
\whatever[foo]{foo} 
\whatever[lol]{rofl} 

Weiß jemand, Wie macht man das? Ich kann bei Bedarf auf einfachen TeX zurückgreifen.

Antwort

4

Der LaTeX-Kernel verfügt über eine eingebaute Methode, obwohl dies nicht weit verbreitet ist. Hier ein Beispiel:

\makeatletter 
\newcommand\@foo[2][]{[1: #1, 2: #2.] } 
\newcommand\foo{\@dblarg\@foo} 
\makeatother 

\foo{same} 
\foo[hello]{world} 

Offensichtlich ist die \makeatletter Befehle gelöscht werden können, wenn Sie tun dies in einer .sty oder .cls Datei.

+0

Gerade aus dem Mund des Pferdes ist immer am besten. – dmckee

+0

Sehr cool ;-) Danke ... –

2

Eine hässliche Hack:

\usepackage{ifthen} 

... 

\newcommand{\whatever}[2][uniquenonesense]{ 
    ... 
    \ifthenelse{\equal{#2}{uniquenonesense}}{#1}{#2} 
    ... 
} 

Vermutlich wollte man etwas sauberer, aber das ist, was ich habe.

Abhängig von Ihrer Semantik ist uniquenonesense möglicherweise leer.

+0

Funktioniert für mich ;-) sicher, sauber wäre nett, aber ich will wirklich nur etwas, das die Arbeit erledigt. Es ist weniger ein Hack als viele andere LaTeX-Code, den ich gelesen habe ... –

0
\newcommand{\haha}[2]{\backslash whatever \left[ #1 \right] 
    \left[ #1  \right] } 

    \begin{document} 
    $\haha{blah}{blah}$\\ 
    $\haha{stupid}{Idiot}$ 
    \end{document} % This works very well. 
Verwandte Themen