
Das folgende MWE wird mit kompiliert, hyperref
aber 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 \hyperref
robust 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 \f
scheint als Annäherung an einen Test gedacht zu sein, ob das durch den Parameter dargestellte Argument #1
aus 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 \ifthenelse
der Befehl beim Auswerten des -Tests \hyperref
anders 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 \f
scheint als Annäherung an einen Test gedacht zu sein, ob das durch den Parameter dargestellte Argument #1
aus 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 \ifthenelse
führt unter anderem Dinge innerhalb eines lokalen Gültigkeitsbereichs aus, \let\equal\TE@equal
wä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 \ifthenelse
und 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.