我从类似的堆栈线程中借用了这段代码
\newcounter{susis}
\newcommand{\myHyperlink}[2]{%
\refstepcounter{susis}\label{susislink#1}%
\ifcsname r@susistarget#1\endcsname
\hyperlink{#1}{\textcolor{blue}{#2}}%
\else
\hyperlink{#1}{\textcolor{red}{#2}}%
\fi
}
\newcommand{\myHypertarget}[2]{%
\refstepcounter{susis}\label{susistarget#1}%
\ifcsname r@susislink#1\endcsname
\hypertarget{#1}{\textcolor{teal}{#2}}%
\else
\hypertarget{#1}{\fbox{\textcolor{red}{#2}}}%
\fi
}
当我运行 时,它可以工作\myHyperlink{Hello}{Hello}
。但是,当我尝试执行\myHyperlink{\lor}{\lor}
(逻辑或符号)时,它显示:Missing \endcsname inserted. <to be read again> \lor
。
我该如何修复这个错误?
附加信息:我正在尝试定位和链接数学运算符。它适用于普通的超目标和超链接,但我想添加附加功能:如果链接指向未声明的目标,它将以红色文本而不是蓝色显示。
答案1
您需要以以下形式使用该指令
\myHyperlink{lor}{$\lor$}
两条一般性建议:
第一个参数应该是一个简单的字符串——没有任何类型的宏
如果第二个参数是数学模式命令,例如
\lor
,则需要使用数学模式来排版,即\lor
用$
符号包围。
\documentclass{article}
\usepackage{xcolor,hyperref}
\hypersetup{colorlinks}
\newcounter{susis}
\makeatletter
\newcommand{\myHyperlink}[2]{%
\refstepcounter{susis}\label{susislink#1}%
\ifcsname r@susistarget#1\endcsname
\hyperlink{#1}{\textcolor{blue}{#2}}%
\else
\hyperlink{#1}{\textcolor{red}{#2}}%
\fi
}
\newcommand{\myHypertarget}[2]{%
\refstepcounter{susis}\label{susistarget#1}%
\ifcsname r@susislink#1\endcsname
\hypertarget{#1}{\textcolor{teal}{#2}}%
\else
\hypertarget{#1}{\fbox{\textcolor{red}{#2}}}%
\fi
}
\makeatother
\begin{document}
\myHyperlink{Hello}{Hello} \myHypertarget{Hello}{Hello}
\myHyperlink{lor}{$\lor$} \myHypertarget{lor}{$\lor$}
\myHyperlink{good1}{Good1} \myHypertarget{good2}{Good2}
\myHyperlink{wedge}{$\wedge$} \myHypertarget{dots}{$\dots$}
\end{document}
答案2
我将使用一种带有可选参数的方法作为内部名称;如果存在,则使用它;否则,则使用强制参数。
但是,您需要使用$
around \lor
,因为它本质上是一个数学命令。
内部名称被“字符串化”,并在.aux
文件中为其添加了适当的保护。
\documentclass{article}
\usepackage[
paperwidth=5cm,
paperheight=5cm,
vmargin=2mm,
hmargin=0.5cm,
includehead,includefoot
]{geometry}
\usepackage{xcolor,xparse,hyperref}
\hypersetup{colorlinks}
\newcounter{susis}
\ExplSyntaxOn
\NewDocumentCommand{\myHyperlink}{ O{#2}m }
{
\japseow_hyperlink:nn { \tl_to_str:n { #1 } } { #2 }
}
\NewDocumentCommand{\myHypertarget}{ O{#2}m }
{
\japseow_hypertarget:nn { \tl_to_str:n { #1 } } { #2 }
}
\cs_new_protected:Nn \japseow_hyperlink:nn
{
\refstepcounter{susis}\label{susislink\protectlabel{#1}}
\tl_if_exist:cTF { r@susistarget#1 }
{
\hyperlink{#1}{\textcolor{blue}{#2}}
}
{
\hyperlink{#1}{\textcolor{red}{#2}}
}
}
\cs_new_protected:Nn \japseow_hypertarget:nn
{
\refstepcounter{susis}\label{susistarget\protectlabel{#1}}
\tl_if_exist:cTF { r@susislink#1 }
{
\hypertarget{#1}{\textcolor{teal}{#2}}
}
{
\hypertarget{#1}{\fbox{\textcolor{red}{#2}}}
}
}
\NewDocumentCommand\protectlabel{m}
{
\tl_to_str:n { #1 }
}
\ExplSyntaxOff
\begin{document}
\myHyperlink{Hello}\clearpage
\myHypertarget{Hello}\clearpage
\myHyperlink{$\lor$}\clearpage
\myHypertarget{$\lor$}\clearpage
\myHyperlink[weird]{This is too weird for using as a link}\clearpage
\myHypertarget[weird]{Good2}\clearpage
\myHypertarget[ops]{Whatever}
\end{document}