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 \theVariable
tem 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 \theVariable
estar 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 \theVariable
nã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 \theVariable
requer 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 \theVariable
enquanto ele solicita um.
Para corrigir isso, basta usar \providecommand*{\theVariable}{\@empty}
. Observe que adicionei o *
porque você não precisa \theVariable
demorar 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