带有数学符号错误的超链接条件

带有数学符号错误的超链接条件

我从类似的堆栈线程中借用了这段代码

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

在此处输入图片描述

答案3

相关内容