LaTeX 中的條件:try/catch 和“not \equal”

LaTeX 中的條件:try/catch 和“not \equal”

我在某些變數檢查方面遇到問題:我在文檔類別的介面中為使用者提供了一個選項。如果未提供該選項,我的程式碼將失敗。因此我想檢查是否已提供該選項。在其他程式設計環境中,我會使用 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 的更大問題沒有得到解答,但我將把問題關閉為“已解決” - 我的代碼現在可以工作

相關內容