Condicionales en LaTeX: try/catch y "not \equal"

Condicionales en LaTeX: try/catch y "not \equal"

Tengo un problema con la verificación de algunas variables: ofrezco al usuario una opción en la interfaz de una clase de documento. Si no se proporciona la opción, mi código falla. Por lo tanto, me gustaría comprobar si se ha proporcionado la opción o no. En otros entornos de programación haría esto con TRY/CATCH de "!=" no igual. ¿Cómo hago esto en LaTeX?

Un ejemplo mínimo se parece a este:

1) clase de documento minimalExample.cls:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{FAIRControlledDocument}[2017/07/03 minimalExample]

\LoadClass[a4paper,11pt]{report}

\RequirePackage{ifthen}
\RequirePackage{xkeyval}

\providecommand{\theVariable}[1]{\@empty}
\DeclareOptionX{docoption}{%
    \def\theVariable{#1}%
}

\ProcessOptionsX

% pre-defined document types
\ifdefined\theVariable
\ifthenelse{\equal{\theVariable}{a} \OR \equal{\theVariable}{b}}{%
    \providecommand\fcd@type@xx{some text}%
}{}
\fi

2) trabajando minimalExample.tex:

\documentclass[docoption=a]{minimalExample}
\begin{document}
test
\end{document}

3) estrellarse minimalExample.tex:

\documentclass[]{minimalExample}
\begin{document}
test
\end{document}

Me gustaría verificar si la variable \theVariabletiene un valor si no se proporciona y, de lo contrario, omitir el código que falla. ¿Algunas ideas?

Respuesta1

Simplemente elimine la \providecommand{\theVariable}línea: luego comprobará si existe con \ifdefined, ¿no es así?

Sin embargo, si luego necesita verificar si es igual a \@empty, haga lo siguiente:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{FAIRControlledDocument}[2017/07/03 minimalExample]

\LoadClass[a4paper,11pt]{report}

\RequirePackage{ifthen}
\RequirePackage{xkeyval}

\newcommand*{\theVariable}{}
\DeclareOptionX{docoption}{%
    \def\theVariable{#1}%
}

\ProcessOptionsX

% pre-defined document types
\ifthenelse{\equal{\theVariable}{a} \OR \equal{\theVariable}{b}}{%
    \providecommand\fcd@type@xx{some text}%
}{}

Nota \newcommand*en lugar de \providecommand(y sin argumento); tenga en cuenta también que defino \theVariableque esté vacío de forma predeterminada, por lo que debe verificar

\ifx\theVariable\@empty

tendría éxito. No lo sería si lo haces \newcommand*{\theVariable}{\@empty}, porque en este caso el texto de reemplazo de \theVariableno está vacío: un cuadro que contiene un cuadro vacío no está vacío, ¿verdad?

Respuesta2

La respuesta a esto es bastante simple. Su definición predeterminada de \theVariablerequiere un argumento, mientras que la que usted define si se usa la opción no, por lo que tiene dos definiciones diferentes dependiendo del uso de la opción. El código falla porque no proporciona un argumento \theVariablemientras solicita uno.

También soluciona este problema, solo usa \providecommand*{\theVariable}{\@empty}. Tenga en cuenta que agregué *porque no necesita \theVariabletardar mucho ya que no acepta argumentos de ninguna manera.

Entonces tu .cls debería verse así:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{FAIRControlledDocument}[2017/07/03 minimalExample]

\LoadClass[a4paper,11pt]{report}

\RequirePackage{ifthen}
\RequirePackage{xkeyval}

\providecommand*{\theVariable}{\@empty}
\DeclareOptionX{docoption}{%
    \def\theVariable{#1}%
}

\ProcessOptionsX\relax

% pre-defined document types
\ifdefined\theVariable
\ifthenelse{\equal{\theVariable}{a} \OR \equal{\theVariable}{b}}{%
    \providecommand\fcd@type@xx{some text}%
}{}
\fi

Respuesta3

Probé los enfoques de egreg y Skillmon pero no logré ejecutar el código. Finalmente logré resolver mi problema real con la siguiente definición de clase:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{FAIRControlledDocument}[2017/07/03 minimalExample]

\LoadClass[a4paper,11pt]{report}

\RequirePackage{ifthen}
\RequirePackage{xkeyval}

%\providecommand{\theVariable}[1]{\@empty} <-- Do not defined this variable
\DeclareOptionX{docoption}{%
    \def\theVariable{#1}%
}

\ProcessOptionsX

% pre-defined document types
\ifdefined\theVariable
\ifthenelse{\equal{\theVariable}{a} \OR \equal{\theVariable}{b}}{%
    \providecommand\fcd@type@xx{some text}%
}{}
\else
   \def\documentLanguage{xx} <-- set some special value for later use
\fi

Aún así, mi pregunta más importante sobre try/catch no tiene respuesta, pero cerraré el problema como "resuelto": mi código funciona ahora.

información relacionada