特定の状況における nohyperref と xifthen の非互換性

特定の状況における nohyperref と xifthen の非互換性

次の MWE は ではコンパイルされますhyperrefが、 ではコンパイルされませんnohyperref

\documentclass{article}
\usepackage{xifthen}
\usepackage{nohyperref} %with hyperref it compiles perfectly wihtout warnings
\newcommand{\f}[1]{
\ifthenelse{\equal{#1}{}}{f}{f(#1)}
}
\newcommand{\D}{\hyperref[eq:D]{\normalcolor D}}

\begin{document}   
\begin{equation}\label{eq:D}
\f{\D}  
\end{equation}
\end{document}

\ifthenelse{\equal{#1}{}}置き換えると、少なくともコンパイルは行われますが\ifblank{#1}、それでもエラーが発生します。

答え1

間違ったツールを使用しているのではないかという印象を受けます ( を参照しています\ifthenelse)。とにかく、\hyperref堅牢なツールを作成すれば、問題なく作業を進めることができます。

\documentclass{article}
\usepackage{xifthen}
\usepackage{nohyperref} %with hyperref it compiles perfectly wihtout warnings

\MakeRobust{\hyperref}

\newcommand{\f}[1]{%
  \ifthenelse{\equal{#1}{}}{f}{f(#1)}%
}
\newcommand{\D}{\hyperref[eq:D]{\normalcolor D}}

\begin{document}

\begin{equation}\label{eq:D}
\f{\D}
\end{equation}

\end{document}

答え2

私はパッケージを決して使用しませんハイパーリファレンスなし

ハイパーリンクのオン/オフをhyperrefパッケージで切り替えるために、通常は内部でのみ行われることをTeXでグローバルに実行します。ハイパーリファレンスの環境NoHyper; ブックマークも考慮する必要があります:

\documentclass{article}
\usepackage{xifthen}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% For turning off hyperlinks activate,                                               %
%% for turning on hyperlinks turn into a comment                                      %                             
%% the following line:                                                                %
\PassOptionsToPackage{bookmarks=false}{hyperref}\newcommand\ProbablySwitchOffHyperlinks{\NoHyper}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{hyperref}
\providecommand\ProbablySwitchOffHyperlinks{}%
\ProbablySwitchOffHyperlinks
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\newcommand{\f}[1]{\ifthenelse{\equal{#1}{}}{f}{f(#1)}}
\newcommand{\D}{\hyperref[eq:D]{\normalcolor D}}

\begin{document}
\tableofcontents
\section{bla}
\section{blu}
\begin{equation}\label{eq:D}
\f{\D}  
\end{equation}
\end{document}

答え3

\ifthenelse{\equal{#1}{}}...マクロの定義の⟨置換テキスト⟩ 内のテストは\f、パラメータによって表される引数が#1トークンで構成されているかどうかをテストする近似値となるように意図されているようです。トークンの処理により、出力ファイル (.pdf ファイルまたは .dvi ファイル) 内にクリック可能なハイパーリンクにできる領域が作成されます。


\DeclareRobustCommand{\D}の代わりにを実行すると\newcommand{\D}、コードはエラー メッセージなしでコンパイルされます。

\documentclass{article}
\usepackage{xifthen}
\usepackage{nohyperref} %with hyperref it compiles perfectly wihtout warnings
\newcommand{\f}[1]{%
  \ifthenelse{\equal{#1}{}}{f}{f(#1)}%
}
\DeclareRobustCommand{\D}{\hyperref[eq:D]{\normalcolor D}}

\begin{document}   
\begin{equation}\label{eq:D}
\f{\D}  
\end{equation}
\begin{equation}\label{eq:empty}
\f{}  
\end{equation}
\end{document}

このソリューションは、他のパッケージをロードしたり、既存のマクロにパッチを適用したりすることなく機能します。

この解決策は、ハイパーリファレンスを禁止するジャーナル。 ;-)



方程式の要素を、同じ方程式の数値につながるハイパーリンクに変換することは、実際のシナリオに似ていないかもしれませんが、あなたの例は、コマンドが実行される状況に応じてコマンドの動作を変える必要性に関連する問題を示すことを目的としています。( \ifthenelse-test を評価する状況では、コマンドは\hyperref、出力ファイル (.dvi ファイル/.pdf ファイル) 内でタイプセットしてハイパーリンクを作成する状況とは異なる方法で動作します。)

\ifthenelse{\equal{#1}{}}...マクロの定義の⟨置換テキスト⟩ 内のテストは\f、パラメータによって表される引数が#1トークンで構成されているかどうかをテストする近似値となるように意図されているようです。トークンの処理により、出力ファイル (.pdf ファイルまたは .dvi ファイル) 内にクリック可能なハイパーリンクにできる領域が作成されます。

\ifthenelseローカル スコープ内の他のコマンドは\let\equal\TE@equal、テスト引数を評価するときにこれを実行します。
この事実は、マクロのインスタンスのテスト引数を現在評価している状況にあるかどうかに応じてフォークするために使用でき\ifthenelse、この場合、実行できないトークンまたはこの場合は必要のないトークンを省略/削除します。

\documentclass{article}
\usepackage{xifthen, xcolor}
\usepackage{nohyperref}

\makeatletter
\newcommand\CheckWhetherCurrentlyEvaluatingIfthenelseTest{%
  \ifx\equal\TE@equal\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
}%
\newcommand{\D}{%
  \CheckWhetherCurrentlyEvaluatingIfthenelseTest{\@firstofone}{\hyperref[eq:D]}%
  {\CheckWhetherCurrentlyEvaluatingIfthenelseTest{}{\normalcolor}D}%
}%
\makeatother

\newcommand{\f}[1]{\ifthenelse{\equal{#1}{}}{f}{f(#1)}}

\begin{document}
\color{blue}
\tableofcontents
\section{bla}
\section{blu}
\begin{equation}\label{eq:D}
\f{\D}  
\end{equation}
\begin{equation}\label{eq:empty}
\f{}  
\end{equation}
\end{document}

この例は、いくぶんやり過ぎです。しかし、これは、拡張可能なコマンドが、拡張/実行される状況に応じて異なる動作を行うように設計できることを示しています。
残念ながら、LaTeX には、LaTeX が現在どのような状況にあるかをいつでも確実に照会できる「状況管理」機能はありません。ましてや、状況タイプのレパートリーや、コマンドの状況依存動作のレパートリーを拡張することはできません。

関連情報