definir - latex commands
/ newcommand// newenvironment-parĂ¡metros opcionales (3)
No puede crear un comando
/foo{parameter}[optional]
simplemente; sin embargo, puede crear un comando/foo[optional]{parameter}
con/newcommand{/foo}[2][def]{Mandatory: #2; optional: #1}
Si lo llama como
/foo{given}
, produciráMandatory: given, optional: def
; si lo llama como/foo[optional]{given}
, produciráMandatory: given, optional: optional
. Probablemente sea así como debería hacerlo: se verá mejor con el resto de su código LaTeX. La creación de un nuevo entorno con parámetros opcionales se realiza de manera similar con/newenvironment{env}[2][def]{(#1,#2)/begingroup}{/endgroup}
donde
#
es nuevamente el argumento opcional; esto se escribe nuevamente como/begin{env}[opt]{req}.../end{env}
. Si realmente quiere un comando en la otra forma, vea el final de mi respuesta.Las preguntas frecuentes de TeX tienen una respuesta sobre la escritura de comandos con más de un argumento opcional . Hay dos opciones para hacerlo. La idea subyacente es definir un comando que tome un argumento opcional, y luego ejecute otro comando que tome un argumento opcional, etc .; El paquete twoopt encapsula esto.
Si realmente desea un comando como /reversed{mandatory}[optional]
, puede hacerlo así. Primero, define un comando que toma un argumento requerido, lo almacena en una macro y luego lo reenvía a otro comando. Este segundo comando toma un argumento opcional y usa el comando definido y el argumento opcional. Poniendo todo esto juntos, obtenemos
/makeatletter
/newcommand{/reversed}[1]{/def/reversed@required{#1}/reversed@opt}
/newcommand{/reversed@opt}[1][def]{Required: /reversed@required; optional: #1}
/makeatother
Luego puede usar /reversed{mandatory}[optional]
o simplemente /reversed{mandatory}
, y todo debería funcionar.
Estoy experimentando con mis propios comandos y entornos y ahora me enfrento a esos problemas:
- ¿Cómo crear el comando
/foo{parameter}[optional]
o el entorno llamado/begin{bar}{parameter}[optional]
? - Cómo crear el comando
/foo[optional_1]...[optional_n]{parameter}
He intentado
/newcommand{/foo}[3][][]{#1#2#3} - failed
/newcommand{/foo}[3][2][][]{#1#2#3} - failed
¿Alguien sabe alguna pista? Muchas gracias.
Considera también el paquete xargs. El siguiente es un ejemplo de su documentación.
Configúralo de la forma habitual.
/usepackage{xargs}
y luego si se define
/newcommandx*/coord[3][1=1, 3=n]{(#2_{#1},/ldots,#2_{#3})}
(lo que significa usar "1" para el primer argumento, si no está especificado, y usar "n" para el tercero). Entonces
$/coord{x}$
rendimientos (sans subíndices)
(x1,..., xn)
y
$/coord[0]{y}$
rendimientos (de nuevo, sin subíndices, y y reemplaza el parámetro obligatorio)
(y0, ..., yn)
Usando el paquete xparse (parte de los esfuerzos de desarrollo de LaTeX3):
/usepackage{xparse}
/NewDocumentCommand/foo{O{}O{}m}{%
% Code with optional #1 and #2 with empty defaults
}
/NewDocumentCommand/foo{mO{}}{%
% Code with optional #2 with empty default
}
/NewDocumentEnvironment{foo}{O{}}{%
% Start code with optional #1
}{%
% End code with optional #1
}
Los argumentos opcionales son un poco diferentes en xparse a con / newcommand. Puedes detectar si uno está dado o no:
/NewDocumentCommand/foo{mo}{%
/IfNoValueTF{#2}
{Code without #2}
{Code with #2}%
}
Verá que esto funciona utilizando una ''o'' minúscula, mientras que la ''O'' mayúscula requiere un valor predeterminado (que he dejado en blanco al incluir un grupo vacío).