La comparación de macros falla

La comparación de macros falla

Soy nuevo en LaTex y mis colegas me han planteado un problema. Definen un tipo de documento en un archivo TeX (por ejemplo, 'svvr', 'srs', ...). Esta definición externa corresponde a las líneas 4 y 5 de mi código de ejemplo (MWE 2).

Ahora debería usar esta definición externa en mi archivo TeX para decidir qué procesamiento dependiente del documento debe realizarse. Para ello, he escrito un MWE para probar la selección.

Mi código de prueba proviene originalmente de Internet y compara el nombre del trabajo con una cadena determinada (por ejemplo, "{\detokenize{svvr}"). Llamé a mi archivo TeX "svvr.tex" para poder hacer la comparación con \jobname.

Mi problema ahora es que cuando comparo con \jobname (MWE 1), la selección funciona correctamente.

\documentclass{article}

% Own TeX file:
\begin{document}
    \edef\docTypeExt{\jobname}
    % Specify which document type is to be handled: 'svvr', 'srs', ...
    \edef\docTypeSvvr{\detokenize{svvr}} 
    \edef\docTypeSrs{\detokenize{srs}}

    \textbf{\jobname} 
    \textbf{\docShortcut}
    \textbf{\docTypeSvvr}
    \textbf{\docTypeSrs}
    \newline
    
    \ifx\docTypeExt\docTypeSvvr
        true
    \else
        false: \\
        \jobname \\
        \docShortcut \\
        \docTypeSvvr
    \fi
\newline

    \ifx\docTypeExt\docTypeSrs
        true
    \else
        false: \\
        \jobname \\
        \docShortcut \\
        \docTypeSrs
    \fi

\end{document}

Pero si lo comparo con la definición externa de mis colegas (MWE 2), la comparación falla.

\documentclass{article}

% Given code, defined in included TeX file: 'svvr', 'srs', ...
\newcommand { \docpropPTdocShortcut } {svvr}    % Define document type here!
\gdef\docShortcut{\docpropPTdocShortcut}

% Own TeX file:
\begin{document}
    \edef\docTypeExt{\docShortcut}
    % Specify which document type is to be handled: 'svvr', 'srs', ...
    \edef\docTypeSvvr{\detokenize{svvr}} 
    \edef\docTypeSrs{\detokenize{srs}}

    \textbf{\jobname} 
    \textbf{\docShortcut}
    \textbf{\docTypeSvvr}
    \textbf{\docTypeSrs}
    \newline
    
    \ifx\docTypeExt\docTypeSvvr
        true
    \else
        false: \\
        \jobname \\
        \docShortcut \\
        \docTypeSvvr
    \fi
\newline

    \ifx\docTypeExt\docTypeSrs
        true
    \else
        false: \\
        \jobname \\
        \docShortcut \\
        \docTypeSrs
    \fi

\end{document}

¿Cómo se debe estructurar la selección para que también funcione con la definición externa?

Modifiqué las definiciones, pero hasta ahora todos los intentos han fallado.

Respuesta1

Cada ficha de personaje entregada por \jobnamees de categoría 12 (otro). Excepción: los espacios (punto de código número 32 tanto en ASCII como en Unicode) son de categoría 10 (espacio). Lo mismo ocurre con las fichas de personaje entregadas por \detokenize.

Sin embargo, los tokens de caracteres que en su segundo ejemplo van en el texto de reemplazo \docpropPTdocShortcutno se entregan \jobnameo \detokenizesurgen debido a la lectura y tokenización de elementos del archivo .tex-input de TeX. Por la presente se aplica otro régimen de código de categorías para que muchas fichas de personajes que surgen de esta manera tengan una categoría que difiere de 12 (otras). Por ejemplo, las fichas de caracteres que denotan letras del alfabeto que surgen de esta manera suelen tener la categoría 11 (letra).

Así, un token de secuencia de control \docTypeSvvro \docTypeSrs, cuyo texto de reemplazo sólo consta de tokens de caracteres que provienen de \jobnameo \detokenizey por lo tanto son tokens de caracteres de categoría 12 (otros) o espacios de categoría 10 (espacio), tiene un significado que difiere del significado de un control. secuencia \docTypeExtdonde los mismos personajes fueron tokenizados con la categoría 11 (letra).
Por lo tanto, \ifxen comparación con su segundo ejemplo de rutas a la \elserama.

Con su segundo ejemplo, puede omitirlo \detokenizeal definir \docTypeSvvr/ \docTypeSrso aplicar \detokenizeo \@onelevel@sanitizeal definir \docTypeExt.

\newline, lo que hace que LaTeX continúe escribiendo el párrafo, pero comenzar otra línea del párrafo, seguida por una línea vacía, lo que hace que LaTeX finalice el párrafo actual, me parece algo redundante: obtienes la vertical \baselineskipde \newliney la vertical \parskipsi eso no es cero. Si la vertical \parskipes cero y en algunos lugares desea un salto vertical entre párrafos, no abuse de esto , \newlineuse \vspaceo \addvspaveo \vskipo \smallskipo .\medskip\bigskip

\newcommand { \docpropPTdocShortcut } {svvr}, donde \docpropPTdocShortcutdespués de la tokenización va precedido de un token de espacio, no es una buena práctica. Si no está en ExplSyntax, donde los espacios ya se ignorarían al momento de tokenizar las cosas, haga:
\newcommand{\docpropPTdocShortcut}{svvr}.

En el siguiente ejemplo, \detokenizese toma la ruta -para que pueda comparar de forma segura con macros cuyo texto de reemplazo se compone de la expansión de, \jobnamesi lo desea.

\documentclass{article}


% Given code, defined in included TeX file: 'svvr', 'srs', ...
%% (In case the TeX file in question does not produce text/a chapter of the document, 
%%  \input might be a better choice than \include ...)

\newcommand{\docpropPTdocShortcut}{svvr}% Define document type here!
\gdef\docShortcut{\docpropPTdocShortcut}

% Own TeX file:
\begin{document}
  \edef\docTypeExt{\docShortcut}%%
  \edef\docTypeExt{\detokenize\expandafter{\docTypeExt}}%%
  %\csname @onelevel@sanitize\endcsname\docTypeExt
  %-----------------------------------------------------------------  
  % Specify which document type is to be handled: 'svvr', 'srs', ...
  \edef\docTypeSvvr{\detokenize{svvr}}%%
  \edef\docTypeSrs{\detokenize{srs}}%%

  \noindent
  \verb|\jobname|: \texttt{\jobname}\\
  \verb|\docShortcut|: \texttt{\meaning\docShortcut}\\
  \verb|\docTypeExt|: \texttt{\meaning\docTypeExt}\\
  \verb|\docTypeSvvr|: \texttt{\meaning\docTypeSvvr}\\
  \verb|\docTypeSrs|: \texttt{\meaning\docTypeSrs}

  \vskip\baselineskip

  \noindent
  \ifx\docTypeExt\docTypeSvvr
      true
  \else
      false:\\
      \jobname\\
      \docShortcut\\
      \docTypeSvvr
  \fi

  \vskip\baselineskip

  \noindent
  \ifx\docTypeExt\docTypeSrs
      true
  \else
      false:\\
      \jobname\\
      \docShortcut\\
      \docTypeSrs
  \fi
\end{document}

información relacionada