\newcommand para ingresar variables de entorno

\newcommand para ingresar variables de entorno

Hago programas de conciertos para mis recitales de estudiantes usando la clase ConcProg. Hay mucha repetición en las canciones que se reproducen, así que me gustaría crear una taquigrafía.

Entonces en lugar de esto

\begin{composition}{Folk Song}{}{Twinkle Twinkle Little Star}{Student Name}
    \end{composition}

Algo como esto.

\newcommand{\twinkle}{{Folk Song}{}{Twinkle Twinkle Little Star}}
\newcommand{\studentname}{{Student Name}}

\begin{composition}\twinkle\studentname
    \end{composition}

Sin embargo, parece que a \newcommand solo le gustan varios conjuntos de corchetes cuando se usan como argumentos para ese nuevo comando específico. Hasta donde puedo decir, ignora los corchetes independientes {es decir, los corchetes no relacionados con los argumentos para ese \newcommand específico o los comandos ubicados dentro del \newcommand}. En el caso de este entorno personalizado, arroja un error.

A continuación se muestra otro ejemplo (que no utiliza un entorno personalizado).

%standard input 
\newcommand{\wbalTwo}[2] {
  This is the Wikibook about LaTeX
  supported by #1 and #2}
\item \wbalTwo{John Doe}{Anthea Smith}
%trying to use new command to input args. In this instance, it seems to ignore the internal braces and treats both internally-braced items as a single text string. 
\newcommand{\wbalTwo}[2] {
  This is the Wikibook about LaTeX
  supported by #1 and #2}
\newcommand{\passargs}

Entonces, ¿existe una manera fácil de lograr que tengan el mismo resultado?

Respuesta1

Por lo que nos ha dicho hasta ahora, no se puede reproducir el problema y, por lo tanto, rastrear/rastrear el origen del problema está, hasta cierto punto, asociado con conjeturas.

Primero, algunas observaciones generales. Espero que mis conjeturas sean correctas y que mis comentarios sean útiles:

  1. A la hora de reunir argumentos para macros o entornos del flujo de tokens, la expansión esnomotivado.
  2. En caso de que esté presente, (La)TeX eliminará el nivel más externo de llaves que rodea uncompletoargumento al insertar ese argumento en el texto de reemplazo durante la expansión.

Después de "excavar" la clase ConcProg en CTAN (https://ctan.org/pkg/concprog), encontré que el entorno compositionprocesa cuatro argumentos:

  1. ⟨autor⟩
  2. ⟨años de nacimiento (y muerte)⟩
  3. ⟨título de la composición⟩
  4. ⟨descripción opcional⟩

Así con

\begin{composition}{Folk Song}{}{Twinkle Twinkle Little Star}{Student Name}
⟨whatsoever environment-body⟩
\end{composition}
  • el primer argumento del composition-environment será: Folk Song,
  • el segundo argumento del composition-environment estará vacío,
  • el tercer argumento del composition-entorno será: Twinkle Twinkle Little Star,
  • el cuarto argumento del composition-entorno será: Student Name,

mientras con

\begin{composition}\twinkle\studentname
\end{composition}
  • el primer argumento del composition-environment será: \twinkle,
  • el segundo argumento del composition-entorno será \studentname,
  • el tercer argumento del composition-entorno será: \end,
  • el cuarto argumento del composition-entorno será: composition.

Esto se debe a que la expansión esnoSe activa cuando LaTeX recopila argumentos para macros o entornos.

Dependiendo de cómo se inserten los argumentos cuando LaTeX ejecuta/expande las macros que subyacen al compositionentorno, esta forma de obtener argumentos puede conducir a todo tipo de comportamiento extraño/erróneo/problemático.

Puedo ofrecer una variante personalizada del compositionentorno, llamada mycomposition, que se encarga de la expansión:

En realidad, el entorno no procesa ningún argumento. En lugar de eso, verifica si el siguiente token en su cuerpo de entorno es expandible o no. Si es así, se realizará la expansión hasta encontrar un token no expandible. (Tenga en cuenta que las llaves de apertura {no son tokens expandibles. ;-)) Luego tomará un argumento. Hace esto cuatro veces para capturar 4 argumentos. Luego, internamente, pasa estos cuatro argumentos a la macro subyacente al compositionentorno:

\documentclass{ConcProg}

\makeatletter
\newcommand\UD@CheckWhetherNextExpandable[2]{%
  \def\UD@reserved@a{#1}%
  \def\UD@reserved@b{#2}%
  \UD@@CheckWhetherNextExpandable
}%
\newcommand\UD@@CheckWhetherNextExpandable{%
  \futurelet\UD@reserved@c\UD@@@CheckWhetherNextExpandable
}%
\newcommand\UD@@@CheckWhetherNextExpandable{%
  \ifx\UD@reserved@c\@sptoken\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
  {\afterassignment\UD@@CheckWhetherNextExpandable\let\UD@reserved@c= }%
  {%
    \expandafter\ifx\noexpand\UD@reserved@c\UD@reserved@c
      \expandafter\UD@reserved@b
    \else
      \expandafter\UD@reserved@a
    \fi
  }%
}%
\newcommand\UD@ExpandUntilFirstUnexpandableAndAddToUD@reserved@d[1]{%
   \ifx\relax#1\relax\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
   {\expandafter\endgroup\UD@reserved@d}%
   {\UD@CheckWhetherNextExpandable
      {\expandafter\UD@@CheckWhetherNextExpandable}%
      {\expandafter\UD@AddNextTo\expandafter{\@gobble#1}\UD@reserved@d}%
   }%
}%
\newcommand\UD@AddNextTo[3]{%
  % \edef..\the\toks@-route prevents halving of hashes.
  \toks@\expandafter{#2{#3}}%
  \edef#2{\the\toks@}%
  \UD@ExpandUntilFirstUnexpandableAndAddToUD@reserved@d{#1}%
}%
\newcommand\UD@ExpandAndAccumulateKArgsAndPassTo[2]{%
  \begingroup
  \def\UD@reserved@d{#2}%
  \expandafter\UD@ExpandUntilFirstUnexpandableAndAddToUD@reserved@d
  \expandafter{\romannumeral\number\number#1 000}%
}%
\newenvironment{mycomposition}%
               {\UD@ExpandAndAccumulateKArgsAndPassTo{4}{\composition}}%
               {\endcomposition}%
\makeatother


\newcommand{\twinkle}{{Folk Song}{}{Twinkle Twinkle Little Star}}
\newcommand{\studentname}{{Student Name}}


\begin{document}

\begin{composition}{Folk Song}{}{Twinkle Twinkle Little Star}{Student Name}%
environment body
\end{composition}

\begin{mycomposition} \twinkle\studentname
environment body
\end{mycomposition}

\begin{mycomposition} \twinkle {Student Name}
environment body
\end{mycomposition}

\begin{mycomposition} {Folk Song}{}{Twinkle Twinkle Little Star} \studentname
environment body
\end{mycomposition}

\begin{mycomposition}{Folk Song}{}{Twinkle Twinkle Little Star}{Student Name}
environment body
\end{mycomposition}

\end{document}

ingrese la descripción de la imagen aquí

información relacionada