Inkompatibilität von nohyperref und xifthen in bestimmten Situationen

Inkompatibilität von nohyperref und xifthen in bestimmten Situationen

Das folgende MWE wird mit kompiliert, hyperrefaber nicht mit 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}

Wenn ich es ersetze, \ifthenelse{\equal{#1}{}}wird \ifblank{#1}es zwar kompiliert, aber immer noch mit einem Fehler.

Antwort1

Ich habe den Eindruck, dass Sie das falsche Werkzeug verwenden (ich beziehe mich auf \ifthenelse). Wie auch immer, machen Sie es \hyperrefrobust und Sie sind auf dem richtigen Weg.

\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}

Antwort2

Ich benutze das Paket niekeinHyperref.

Um zwischen dem Ein- und Ausschalten von Hyperlinks mit dem Paket hyperref umzuschalten, lasse ich TeX global das tun, was normalerweise nur innerhalb vonHyperref's Umgebung NoHyper; auch um Lesezeichen muss man sich kümmern:

\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}

Antwort3

Der Test \ifthenelse{\equal{#1}{}}...im ⟨Ersatztext⟩ der Definition des Makros \fscheint als Annäherung an einen Test gedacht zu sein, ob das durch den Parameter dargestellte Argument #1aus Token besteht, deren Verarbeitung dazu führt, dass in der Ausgabedatei (.pdf-Datei oder .dvi-Datei) ein Bereich erstellt wird, der in einen anklickbaren Hyperlink umgewandelt werden kann.


Wenn Sie \DeclareRobustCommand{\D}anstelle von verwenden \newcommand{\D}, wird Ihr Code ohne Fehlermeldungen kompiliert:

\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}

Diese Lösung funktioniert ohne das Laden anderer Pakete und ohne das Patchen vorhandener Makros.

Diese Lösung sollte auch funktionieren fürZeitschriften, die Hyperref verbieten. ;-)



Ich denke, dass die Umwandlung einer Komponente einer Gleichung in einen Hyperlink, der zur Nummer dieser Gleichung führt, nicht unbedingt einem realen Szenario entspricht, aber Ihr Beispiel soll Probleme aufzeigen, die mit der Notwendigkeit zusammenhängen, dass sich das Verhalten von Befehlen je nach der Situation, in der sie ausgeführt werden, ändern muss. (Während sich \ifthenelseder Befehl beim Auswerten des -Tests \hyperrefanders verhalten soll als beim Setzen und Erstellen von Hyperlinks innerhalb der Ausgabedatei (.dvi-Datei/.pdf-Datei).)

Der Test \ifthenelse{\equal{#1}{}}...im ⟨Ersatztext⟩ der Definition des Makros \fscheint als Annäherung an einen Test gedacht zu sein, ob das durch den Parameter dargestellte Argument #1aus Token besteht, deren Verarbeitung dazu führt, dass in der Ausgabedatei (.pdf-Datei oder .dvi-Datei) ein Bereich erstellt wird, der in einen anklickbaren Hyperlink umgewandelt werden kann.

Der Befehl \ifthenelseführt unter anderem Dinge innerhalb eines lokalen Gültigkeitsbereichs aus, \let\equal\TE@equalwährend er sein Testargument auswertet.
Diese Tatsache kann zum Forken genutzt werden, je nachdem, ob man sich gerade in der Situation befindet, das Testargument einer Instanz des Makros auszuwerten \ifthenelseund dabei Token wegzulassen/zu entfernen, die in diesem Fall nicht ausgeführt werden können/nicht benötigt werden:

\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}

Dieses Beispiel ist etwas übertrieben. Aber es veranschaulicht, wie erweiterbare Befehle so gestaltet werden könnten, dass sie je nach Situation, in der sie erweitert/ausgeführt werden, unterschiedliche Dinge tun.
Leider gibt es in LaTeX kein „Situationsmanagement“, mit dem man jederzeit zuverlässig abfragen könnte, in welcher Art von Situation sich LaTeX gerade befindet, geschweige denn das Repertoire der Situationstypen und das Repertoire der situationsabhängigen Verhaltensweisen eines Befehls erweitern könnte.

verwandte Informationen