Frage

Wie erstellen Sie einen Befehl mit optionalen Argumenten in LaTeX? So etwas wie:

\newcommand{\sec}[2][]{
    \section*{#1
        \ifsecondargument
            and #2
        \fi}
    }
}

Dann kann ich es wie nennen

\sec{Hello}
%Output: Hello
\sec{Hello}{Hi}
%Output: Hello and Hi
War es hilfreich?

Lösung

Beispiel aus der Führung :

\newcommand{\example}[2][YYY]{Mandatory arg: #2;
                                 Optional arg: #1.}

This defines \example to be a command with two arguments, 
referred to as #1 and #2 in the {<definition>}--nothing new so far. 
But by adding a second optional argument to this \newcommand 
(the [YYY]) the first argument (#1) of the newly defined 
command \example is made optional with its default value being YYY.

Thus the usage of \example is either:

   \example{BBB}
which prints:
Mandatory arg: BBB; Optional arg: YYY.
or:
   \example[XXX]{AAA}
which prints:
Mandatory arg: AAA; Optional arg: XXX.

Andere Tipps

Die allgemeine Idee „optionale Argumente“ hinter der Erstellung ist es, zunächst einen Zwischen Befehl zu definieren, die vor ihnen durchsucht zu erkennen, welche Zeichen in dem Token-Stream nächsten kommt und fügt dann die entsprechenden Makros das Argument (en) zu verarbeiten, kommt als angemessen. Dies kann sehr langwierig sein (wenn auch nicht schwer) generic TeX Programmierung. LaTeX \@ifnextchar ist sehr nützlich für solche Dinge.

Die beste Antwort auf Ihre Frage ist das neue xparse Paket zu verwenden. Es ist Teil der LaTeX3 Programmierung Suite und enthält umfangreiche Funktionen für Befehle mit ganz beliebigen optionalen Argumenten zu definieren.

In Ihrem Beispiel haben Sie eine \sec Makro, dass entweder ein oder zwei verspannt Argumente annimmt. Dies würde mit xparse mit folgendem implementiert werden:

\documentclass{article}
\usepackage{xparse}
\begin{document}
\DeclareDocumentCommand\sec{ m g }{%
    {#1%
        \IfNoValueF {#2} { and #2}%
    }%
}
(\sec{Hello})
(\sec{Hello}{Hi})
\end{document}

Das Argument { m g } definiert die Argumente von \sec; m bedeutet "obligatorisches Argument" und g ist "optional verspannten Argument". \IfNoValue(T)(F) kann dann verwendet werden, um zu prüfen, ob das zweite Argument war in der Tat vorhanden ist oder nicht. Lesen Sie die Dokumentation für die anderen Arten von optionalen Argumenten, die zulässig sind.

Alle der oben genannten Show schwer kann es eine schöne, flexibel zu machen sein (oder eine überlastete bewahre) Funktion in LaTeX !!! (Der TeX-Code sieht aus wie griechisch mir)

gut, nur meine letzte hinzuzufügen (wenn auch nicht so flexibel) Entwicklung, hier ist was ich vor kurzem in meiner Arbeit doc verwendet habe, mit

\usepackage{ifthen}  % provides conditonals...

Starten Sie den Befehl, mit dem „optional“ Befehl standardmäßig leer:

\newcommand {\figHoriz} [4] []  {

Ich habe dann das Makro gesetzt eine temporäre Variable, \ temp {}, unterschiedlich, je nachdem, ob das optionale Argument ist leer. Dies könnte zu jedem übergebene Argumente erweitert werden.

\ifthenelse { \equal {#1} {} }  %if short caption not specified, use long caption (no slant)
    { \def\temp {\caption[#4]{\textsl{#4}}} }   % if #1 == blank
    { \def\temp {\caption[#1]{\textsl{#4}}} }   % else (not blank)

Dann laufe ich das Makro die \ temp mit {} Variable für die beiden Fälle. (Hier setzt nur die Kurzbeschreibung mit der langen Beschriftung gleich, wenn sie nicht vom Benutzer angegeben wurde).

\begin{figure}[!]
    \begin{center}
        \includegraphics[width=350 pt]{#3}
        \temp   %see above for caption etc.
        \label{#2}
    \end{center}
\end{figure}
}

In diesem Fall habe ich nur für die Single "optional" Argument überprüfen, die \ newcommand {} zur Verfügung stellen. Wenn Sie es einrichten waren bis zu etwa 3 „optional“ args, dann würden Sie noch die 3 leere args senden ... zB.

\MyCommand {first arg} {} {} {}

das ist ziemlich dumm, ich weiß, aber das ist so weit ich mit LaTeX gehen werde - es ist nicht nur, dass sensical einmal beginne ich bei TeX-Code suchen ... ich wie Mr. Robertson xparse Methode obwohl vielleicht werde ich versuchen, es ...

Alles, was Sie brauchen, ist die folgende:

\makeatletter
\def\sec#1{\def\tempa{#1}\futurelet\next\sec@i}% Save first argument
\def\sec@i{\ifx\next\bgroup\expandafter\sec@ii\else\expandafter\sec@end\fi}%Check brace
\def\sec@ii#1{\section*{\tempa\ and #1}}%Two args
\def\sec@end{\section*{\tempa}}%Single args
\makeatother

\sec{Hello}
%Output: Hello
\sec{Hello}{Hi}
%Output: Hello and Hi

Ich hatte ein ähnliches Problem, wenn ich einen Befehl, \dx, schaffen wollte abzukürzen \;\mathrm{d}x (d stellte einen zusätzlichen Raum vor dem Differential der integralen und haben die „d“ aufrecht als auch). Aber dann wollte ich auch darauf genug sind die Variablen der Integration als optionales Argument flexibler machen. Ich habe den folgenden Code in der Präambel.

\usepackage{ifthen}

\newcommand{\dx}[1][]{%
   \ifthenelse{ \equal{#1}{} }
      {\ensuremath{\;\mathrm{d}x}}
      {\ensuremath{\;\mathrm{d}#1}}
}

Dann

\begin{document}
   $$\int x\dx$$
   $$\int t\dx[t]$$
\end{document}

\ dx mit optionalem Argumente

Hier ist mein Versuch, es nicht Ihren Angaben genau obwohl folgen. Nicht vollständig getestet, so vorsichtig sein.

\newcount\seccount

\def\sec{%
    \seccount0%
    \let\go\secnext\go
}

\def\secnext#1{%
    \def\last{#1}%
    \futurelet\next\secparse
}

\def\secparse{%
    \ifx\next\bgroup
        \let\go\secparseii
    \else
        \let\go\seclast
    \fi
    \go
}

\def\secparseii#1{%
    \ifnum\seccount>0, \fi
    \advance\seccount1\relax
    \last
    \def\last{#1}%
    \futurelet\next\secparse
}

\def\seclast{\ifnum\seccount>0{} and \fi\last}%

\sec{a}{b}{c}{d}{e}
% outputs "a, b, c, d and e"

\sec{a}
% outputs "a"

\sec{a}{b}
% outputs "a and b"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top