変数のチェックで問題があります。ドキュメント クラスのインターフェイスでユーザーにオプションを提供しています。オプションが提供されていない場合、コードは失敗します。そのため、オプションが提供されているかどうかを確認したいと思います。他のプログラミング環境では、"!=" が等しくないという 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
これに対する答えは簡単です。 のデフォルト定義には引数が必要ですが、オプションが使用される場合に定義する定義には引数が必要ないため、オプションの使用法に応じて 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に関する私の大きな疑問は解決されていませんが、問題は「解決済み」としてクローズします。私のコードは今動作します。