Condicionais em LaTeX: try/catch e "not \equal"

Condicionais em LaTeX: try/catch e "not \equal"

Estou com um problema com algumas verificações de variáveis: ofereço ao usuário uma opção na interface de uma classe de documento. Se a opção não for fornecida, meu código falhará. Portanto, gostaria de verificar se a opção foi fornecida ou não. Em outros ambientes de programação eu faria isso com TRY/CATCH de "!=" diferente. Como faço isso em LaTeX?

Um exemplo mínimo é assim:

1) classe 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) trabalhando minimalExample.tex:

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

3) travando minimalExample.tex:

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

Gostaria de verificar se a variável \theVariabletem um valor, caso não seja fornecida, e ignorar o código com falha, caso não seja. Alguma ideia?

Responder1

Basta remover a \providecommand{\theVariable}linha: mais tarde você verificará se ela existe com \ifdefined, não é?

No entanto, se mais tarde você precisar verificar se é igual \@empty, faça assim:

\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*em vez de \providecommand(e sem argumento); observe também que eu defino \theVariableestar vazio por padrão, então uma verificação

\ifx\theVariable\@empty

teria sucesso. Não aconteceria se você fizesse isso \newcommand*{\theVariable}{\@empty}, porque neste caso o texto de substituição de \theVariablenão está vazio: uma caixa contendo uma caixa vazia não está vazia, não é?

Responder2

A resposta para isso é bastante simples. Sua definição padrão \theVariablerequer um argumento, enquanto aquela que você define se a opção for usada não, então você tem duas definições diferentes dependendo do uso da opção. O código falha porque você não fornece um argumento \theVariableenquanto ele solicita um.

Para corrigir isso, basta usar \providecommand*{\theVariable}{\@empty}. Observe que adicionei o *porque você não precisa \theVariabledemorar muito, pois ele não aceita argumentos de forma alguma.

Portanto, seu .cls deve ficar assim:

\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

Responder3

Tentei as abordagens de egreg e Skillmon, mas não consegui colocar o código em execução. Finalmente consegui resolver meu problema real com a seguinte definição de classe:

\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

Ainda assim, minha pergunta maior sobre try/catch não foi respondida, mas encerrarei o problema como "resolvido" - meu código funciona agora

informação relacionada