特定情况下 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}

此解决方案无需加载其他包,也无需修补现有宏。

此解决方案也适用于禁止超链接的期刊。 ;-)



我认为将方程式的某个部分转换为指向该方程式数字的超链接可能与现实生活中的情况并不相似,但您的示例旨在展示与命令行为需要根据执行情况而变化相关的问题。(而在评估 -test 的情况下,\ifthenelse命令的\hyperref行为方式与在输出文件(.dvi-file/.pdf-file)中排版和创建超链接时的行为不同。)

\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 当前处于哪种情况,更不用说扩展情况类型的范围和命令的与情况相关的行为的范围了。

相关内容