Argumentos opcionales en "familias"... ¿Cuándo y cómo?

Argumentos opcionales en "familias"... ¿Cuándo y cómo?

Editar: Acerca de la recompensa. Estoy satisfecho con la pregunta siguiente y esta recompensa es para esa pregunta. No creo que pueda tomar una mejor

Busqué un poco sobre el uso de argumentos opcionales en LaTeX pero algunas cosas aún no me quedan muy claras.

Cuando

Mi pregunta no es específica de comandos ni de paquetes sino de ambos.

A veces necesitamos especificar uno o más argumentos opcionales para un paquete o para un comando. Podemos encontrar comandos como:

\Foo[OptArg1,OptArg2]{Arg1}{Arg2}

y, como:

\Foo[OptArg1][OptArg2]{Arg1}{Arg2}

Para el primero veo una familia con dos argumentos opcionales separados por comas. Para el segundo tengo dos familias con un argumento opcional para cada una.

Supongo que algo es diferente en estas dos formas, pero no entiendo exactamente cuándo mi comando tiene que usar la primera y cuándo tiene que usar la segunda.

Por ejemplo, digamos que necesitamos un comando que use nuestro primer argumento opcional para dividir el primer argumento no opcional en partes. Entonces prefiero la segunda forma porque en la primera no se entenderá mi coma como separador (ya es separador). Pero todavía podría usar un comando como:

\Foo[separator={,},OptArg2]{Arg1}{Arg2}

para hacer lo mismo.

Por supuesto, si quisiera separar los argumentos opcionales de la segunda familia a mi manera con \Foo[separator={//}][OptArg2//OptArg3] sería la única (o al menos una mejor) opción porque no tengo que definir el separador antes de leer los argumentos de la segunda familia.

Cómo

Además, a veces el mando tiene que comportarse diferente si se dan dos familias y deferente si se da una. Por ejemplo, en mi ejemplo anterior, si no se proporciona el primer argumento, se utilizará una coma para separar los argumentos opcionales de la segunda familia. Pero si se proporciona, se usará como separador y el comando se comportará de manera diferente al leer los argumentos.

En tales situaciones creo que \def es una opción más general para escribir el comando que newcommand porque tenemos más opciones al leer los argumentos. (\newcommand romperá el segundo argumento antes de leer el primero o algo así. Considere también un ']' incluido en los argumentos de la segunda familia...)

Mis preguntas son:

  1. ¿Cuándo (LaTeX estándar) tengo que usar la primera forma y cuándo la segunda?
  2. ¿Es \def la única o mejor manera de definir nuestros comandos en situaciones generales como en situaciones en las que aún no conocemos la cantidad de argumentos o en situaciones como la anterior con el separador o el ']' que ya describí?

PD: En la segunda pregunta, considere que quiero que mi comando me permita leer el siguiente personaje para manejar muchas situaciones. (Por ejemplo, quiero leer los caracteres después del comando uno por uno y detenerme solo si he encontrado dos argumentos comunes o el comando \stop, etc. No pido el código de esto, solo pregunto si \newcommand puede hacerlo, y es una buena opción, o si \def es la única opción)

Respuesta1

Tu pregunta mezcla dos cosas distintas. LaTex2e tiene argumentos opcionales []y argumentos obligatorios {}.

\Foo[OptArg1,OptArg2]{Arg1}{Arg2}

tiene un argumento opcional y dos argumentos obligatorios.

\Foo[OptArg1][OptArg2]{Arg1}{Arg2}

tiene dos argumentos opcionales y dos argumentos obligatorios.

El segundo problema es la lista separada por comas, esto puede no ser parte de la sintaxis en absoluto, solo la coma se trata como un carácter, por ejemplo después

 \newcommand\Foo[3][]{(#1)-(#2)(#3)}

entonces #1sería OptArg1,OptArg2, #2sería Arg1y #3sería Arg2y el resultado sería tipografiar

(OptArg1,OptArg2)-(Arg1)-(Arg2)

sin que las comas jueguen ninguna regla especial.

Por supuesto, un comando puede hacer lo que quiera con los argumentos y esto puede incluir iterar sobre las comas. Hay funciones en formato látex para eso ( \@for) o varios paquetes ofrecen macros para analizar listas separadas por comas. Sin embargo, esto es independiente de la detección de argumentos opcional. En el ejemplo de sintaxis (legal)

 \usepackage[foo,bar]{array,longtable}[2015/01/01 packages by you, me and someone]

hay dos argumentos opcionales y un argumento obligatorio, el primer argumento opcional y el obligatorio se dividen más tarde, como parte del procesamiento de \usepackage, en comas. El segundo argumento opcional no está dividido por comas, sino que de hecho está dividido por /un espacio para extraer la fecha desde el inicio del argumento.

En cuanto a la definición, si solo tiene un argumento opcional al principio, puede usar. \newcommandSi tiene dos o más, también puede usar \newcommand pero necesita definir la macro en etapas, pero probablemente sea más fácil de usar xparseo paquetes similares que permitan una Especificaciones más simples y se encargan automáticamente de definir las macros internas necesarias. Sin embargo, es mejor no tener demasiados argumentos opcionales consecutivos como si tuviera

 \Foo[OptArg1][OptArg2]{Arg1}{Arg2}

entonces OptArg1no es realmente opcional si necesita especificarlo OptArg2. Una sintaxis como

\Foo[opt1=a,opt2=b]{Arg1}

permite omitir cada opción de forma independiente. Pero nuevamente, este análisis clave=valor se puede aplicar a cualquier cadena de tokens, ya sea un argumento obligatorio u opcional. Por ejemplo, graphicxutiliza el keyvalpaquete para analizar ,y =en su argumento opcional.

\includegraphics[width=10pt,height=8pt]{image}

y hyperrefutiliza el mismo análisis para analizar la misma sintaxis en un argumento obligatorio

\hypersetup{colorlinks=false,plainpages=true}

información relacionada