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 \theVariable
tiene 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 \theVariable
que 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 \theVariable
no 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 \theVariable
requiere 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 \theVariable
mientras solicita uno.
También soluciona este problema, solo usa \providecommand*{\theVariable}{\@empty}
. Tenga en cuenta que agregué *
porque no necesita \theVariable
tardar 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.