我在某些變數檢查方面遇到問題:我在文檔類別的介面中為使用者提供了一個選項。如果未提供該選項,我的程式碼將失敗。因此我想檢查是否已提供該選項。在其他程式設計環境中,我會使用 TRY/CATCH 的“!=”不相等來執行此操作。我如何在 LaTeX 中做到這一點?
一個最小的例子如下:
1)文檔類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)工作minimalExample.tex
:
\documentclass[docoption=a]{minimalExample}
\begin{document}
test
\end{document}
3)崩潰minimalExample.tex
:
\documentclass[]{minimalExample}
\begin{document}
test
\end{document}
我想檢查變數是否\theVariable
有值(如果未提供),如果沒有則繞過崩潰程式碼。有任何想法嗎?
答案1
只需刪除該\providecommand{\theVariable}
行:稍後您將檢查它是否存在\ifdefined
,不是嗎?
但是,如果您稍後需要檢查它是否等於\@empty
,請執行以下操作:
\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}%
}{}
注意\newcommand*
而不是\providecommand
(並且沒有參數);另請注意,我\theVariable
預設定義為空,因此檢查
\ifx\theVariable\@empty
會成功的。如果您這樣做,則不會\newcommand*{\theVariable}{\@empty}
,因為在這種情況下, 的替換文字\theVariable
不為空:包含空框的框不為空,是嗎?
答案2
這個問題的答案相當簡單。您的預設定義\theVariable
需要一個參數,而您在使用該選項時定義的參數則不需要,因此根據選項的使用情況,您有兩個不同的定義。該程式碼失敗,因為您\theVariable
在它請求參數時沒有提供參數。
要解決這個問題,只需使用\providecommand*{\theVariable}{\@empty}
.請注意,我添加了 ,*
因為您不需要\theVariable
太長,因為它不以任何方式接受參數。
所以你的 .cls 應該是這樣的:
\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
答案3
我嘗試了egreg和Skillmon的方法,但沒有設法讓程式碼運行。最後我設法透過以下類別定義解決了我的實際問題:
\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
儘管如此,我關於 try/catch 的更大問題沒有得到解答,但我將把問題關閉為“已解決” - 我的代碼現在可以工作