Comment créer une commande avec des arguments optionnels dans LaTeX? Quelque chose comme:
\newcommand{\sec}[2][]{
\section*{#1
\ifsecondargument
and #2
\fi}
}
}
Ensuite, je peux l'appeler comme
\sec{Hello}
%Output: Hello
\sec{Hello}{Hi}
%Output: Hello and Hi
latex
optional-arguments
Verhogen
la source
la source
Réponses:
Exemple du guide :
la source
L'idée générale derrière la création "d'arguments optionnels" est de définir d'abord une commande intermédiaire qui scanne en avant pour détecter quels caractères viennent ensuite dans le flux de jetons, puis insère les macros appropriées pour traiter le ou les arguments à venir. Cela peut être assez fastidieux (mais pas difficile) en utilisant la programmation TeX générique. LaTeX
\@ifnextchar
est très utile pour de telles choses.La meilleure réponse à votre question est d'utiliser le nouveau
xparse
package. Il fait partie de la suite de programmation LaTeX3 et contient des fonctionnalités étendues pour définir des commandes avec des arguments optionnels assez arbitraires.Dans votre exemple, vous avez une
\sec
macro qui prend un ou deux arguments contreventés. Cela serait implémenté en utilisantxparse
les éléments suivants:L'argument
{ m g }
définit les arguments de\sec
;m
signifie "argument obligatoire" etg
est "argument optionnel avec accolades".\IfNoValue(T)(F)
peut alors être utilisé pour vérifier si le deuxième argument était bien présent ou non. Consultez la documentation pour les autres types d'arguments facultatifs autorisés.la source
(Hello and ) (Hello and Hi)
Tout ce qui précède montre qu'il peut être difficile de créer une fonction agréable et flexible (ou d'interdire une fonction surchargée) dans LaTeX !!! (ce code TeX ressemble à du grec pour moi)
Eh bien, juste pour ajouter mon développement récent (mais pas aussi flexible), voici ce que j'ai récemment utilisé dans ma thèse, avec
Démarrez la commande, avec la commande "facultative" vide par défaut:
J'ai alors la macro définir une variable temporaire, \ temp {}, différemment selon que l'argument optionnel est vide ou non. Cela pourrait être étendu à tout argument passé.
Ensuite, j'exécute la macro en utilisant la variable \ temp {} pour les deux cas. (Ici, il définit simplement la légende courte pour qu'elle soit égale à la légende longue si elle n'a pas été spécifiée par l'utilisateur).
Dans ce cas, je ne vérifie que le seul argument "optionnel" fourni par \ newcommand {}. Si vous deviez le configurer pour, disons, 3 arguments "optionnels", vous devrez toujours envoyer les 3 arguments vides ... par exemple.
ce qui est assez idiot, je sais, mais c'est à peu près aussi loin que je vais aller avec LaTeX - ce n'est tout simplement pas si sensique une fois que je commence à regarder le code TeX ... J'aime la méthode xparse de M. Robertson, peut-être que je Je vais l'essayer ...
la source
Tout ce dont vous avez besoin est ce qui suit:
la source
x^2+1
oux^{2+1}
Alors j'ai une question, votre commande teste-t-elle la présence d'accolades? Est-il possible de créer une commande LaTeX\sec
produisant: "A, b, c et d" pour la commande\sec{A}[b,c,d]
, "A et b" pour\sec{A}[b] and "A" for
\ sec {A} `?\sec{A}[b,c,d]
ou\sec{A}[b]
ou\sec{A}
.J'ai eu un problème similaire, quand je voulais créer une commande,
\dx
abréger\;\mathrm{d}x
(c'est-à-dire mettre un espace supplémentaire avant le différentiel de l'intégrale et avoir le «d» à la verticale également). Mais j'ai également voulu le rendre suffisamment flexible pour inclure la variable d'intégration comme argument optionnel. J'ai mis le code suivant dans le préambule.ensuite
donne \ dx avec un argument optionnel
la source
Voici ma tentative, cela ne suit pas exactement vos spécifications. Pas entièrement testé, alors soyez prudent.
la source