Asignar valor a una variable local en un nuevo comando

Asignar valor a una variable local en un nuevo comando

Tengo un archivo tex con algunas de mis funciones personalizadas, una de las cuales es una función de cambio de caso.
Como uso \input para llamar a este archivo desde otros documentos, necesito que la variable de salida sea local. Sin embargo, necesito una variable local para almacenar la salida mientras repito el resto del ciclo. O eso o cancelar el ciclo e ir al final de la función.

Estoy usando tex maker y pdftex

\usepackage{xparse}
\usepackage{fp}
\usepackage{xstring}
\usepackage{ifthen}
\usepackage{printlen}
\usepackage{listofitems}
\usepackage{forloop}
\usepackage{pgffor}

\NewDocumentCommand\SwitchCase{m m}
{
    \setsepchar{,/-}
    \readlist\Cases{#2}
    \FPadd\CaseCount{\Caseslen}{0}
    \def\out{}
    \foreach \ct in {1,...,\CaseCount}
    {
        \ifthenelse{\equal{#1}{\Cases[\ct ,1]}}
        {
            \def\tmp{\Cases[\ct, 2]}
            %\tmp
            \def\out{\tmp}
        }
        {}
    }
    \out
}

%below is a sample of how this code would work
%not exactly how I would use it, but still valid example

\begin{document}

\SwitchCase{hello}{hel-1,he-2,hello-3,Hello-4}

\end{document}

Dado el ejemplo, la función debería devolver 3; sin embargo, cuando intento configurar la variable de salida en el bucle, devuelve 0 o nada.

Esta función tiene muchos usos posibles en mis documentos, por lo que tiene que ser vaga.

PD: Pido disculpas si alguna parte de la redacción es incómoda, no soy el mejor con la sintaxis y la elección de palabras.

Respuesta1

Puede implementar la funcionalidad sin utilizar todos los paquetes aquí:

\documentclass{article}

\makeatletter
\newcommand\SwitchCase[2]{%
  \def\tmpa{#1}%
  \@for\tmp:=#2\do{\expandafter\zz@switch\tmp\zz@switch}%
 }
 \def\zz@switch#1-#2\zz@switch{%
  \def\tmpb{#1}%
   \ifx\tmpa\tmpb#2\fi}

\makeatother

\begin{document}

\SwitchCase{hello}{hel-1,he-2,hello-3,Hello-4}

\end{document}

Respuesta2

Es el problema de siempre: \foreachlos ciclos se hacen en grupo.

Además, debe expandir completamente el texto de reemplazo de \tmp(pero no lo necesita y puede definirlo directamente \out).

\documentclass{article}
\usepackage{xparse}
\usepackage{fp}
\usepackage{xstring}
\usepackage{ifthen}
\usepackage{printlen}
\usepackage{listofitems}
\usepackage{forloop}
\usepackage{pgffor}

\NewDocumentCommand\SwitchCase{m m}
 {%
    \setsepchar{,/-}%
    \readlist\Cases{#2}%
    \foreach \ct in {1,...,\Caseslen}
     {%
        \ifthenelse{\equal{#1}{\Cases[\ct ,1]}}
         {%
            \xdef\out{\Cases[\ct, 2]}
         }
         {}%
     }%
    \out
 }

\begin{document}

\SwitchCase{hello}{hel-1,he-2,hello-3,Hello-4}

\end{document}

Esto produce 3.

Tenga cuidado con los finales de línea desprotegidos que generan espacios que podrían no ignorarse, según el contexto donde se llama a la macro.

Una versión más corta usando expl3:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand\SwitchCase{m m}
 {
  \clist_map_inline:nn { #2 }
   {
    \__cdickstein_switchcase_item:nn { #1 } { ##1 }
   }
 }

\cs_new:Nn \__cdickstein_switchcase_item:nn
 {
  \__cdickstein_switchcase_item:nw { #1 } #2 \q_stop
 }

\cs_new:Npn \__cdickstein_switchcase_item:nw #1 #2 - #3 \q_stop
 {
  \str_if_eq:nnT { #1 } { #2 } { \clist_map_break:n { #3 } }
 }
\ExplSyntaxOff

\begin{document}

\SwitchCase{hello}{hel-1,he-2,hello-3,Hello-4}

\end{document}

Esto se detiene en el primer partido.

Una versión ampliable que vuelve a detenerse en el primer partido.

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewExpandableDocumentCommand\SwitchCase{m m}
 {
  \__cdickstein_switchcase:nw { #1 } #2 , , \q_nil
 }

\cs_new:Npn \__cdickstein_switchcase:nw #1 #2 ,
 {
  \tl_if_blank:nTF { #2 }
   {
    \use_none:n
   }
   {
    \__cdickstein_switchcase_item:nw { #1 } #2 \q_stop
    \__cdickstein_switchcase:nw { #1 }
   }
 }
\cs_new:Npn \__cdickstein_switchcase_item:nw #1 #2 - #3 \q_stop
 {
  \str_if_eq:nnT { #1 } { #2 } { #3 \__cdickstein_swithcase_break:w }
 }

\cs_new:Npn \__cdickstein_swithcase_break:w #1 \q_nil {}
\ExplSyntaxOff

\begin{document}

\SwitchCase{hello}{hel-1,he-2,hello-3,Hello-4}

\SwitchCase{x}{x-1,y-2,x-3}

\end{document}

información relacionada