如何为超链接标签启用非标准字符,例如空格或德语变音符号 (ä,ö,ü)?

如何为超链接标签启用非标准字符,例如空格或德语变音符号 (ä,ö,ü)?

我正在尝试编写一个小程序包(作为次要子功能),其中包含一些 hyperref 用法以获取内部交叉引用。确切地说,我希望提供如下功能:

\mytarget{Äö üß} % prints "Äö üß" in a section-like style

some text goes here

\mylink{Äö üß} % clickable reference to the above

重要的是,用户不需要指定标签,这应该自动处理。

这是我迄今为止思考的一个最小(非)工作示例:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{hyperref}

\makeatletter
\newcounter{@hash@id}
\newcommand\hashstring[1]{%
  \ifcsname #1\endcsname%
  \typeout{#1 already defined}%
  \else
    \expandafter\xdef\csname #1\endcsname{\the@hash@id}%
    \stepcounter{@hash@id}%
    \typeout{defining #1 now}%
    \fi
  \csname #1\endcsname%
}
\makeatother

\newcommand\mytarget[1]{\hypertarget{\hashstring{#1}}{\section{#1}}}
\newcommand\mylink[1]{\hyperlink{\hashstring{#1}}{\textit{#1}}}

\begin{document}
\mytarget{Äö üß}
some text goes here
\newpage
\mylink{Äö üß}
\end{document}

如您所见,我试图通过枚举全局计数器中的不同“目标”来自动生成标签,结果数字就是标签。这可能不是最聪明的方法,但我希望它易于实现。(在最终版本中,我当然会在标签中添加一些特定于包的前缀,以免干扰用户定义的标签)。

但是,由于“缺少 \endcsname”错误,它无法工作,我不完全理解 - 但通过浏览文档,我可以猜测它与超链接和超目标参数的扩展顺序有关。

如果您能提供任何有关如何通过其他方式实现此功能的建议和/或帮助,我们将不胜感激。

答案1

您的方法实际上存在两个问题/错误:

  1. \hyper…要求第一个参数完全可扩展。您的\hashstring宏不是这样的。( \typeout?? \stepcounter)

    但是你的\csname #1\endcsname是一个(它只包含计数器)。

    我的解决方案:您的\my…#1在宏之外进行处理\hyper…(即,\csname #1\endcsname如有必要,创建)并直接\hyper…使用。\csname #1\endcsname

  2. 变音符号问题。TeX/ 如何inputenc处理 ASCII 范围之外的字符是一个棘手的问题,我猜这些字符的扩展性不如\csname它们需要的那样。

    我的解决方案:\detokenize参数。

代码

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{hyperref}

\makeatletter
\newcounter{@hash@id}
\newcommand\hashstring[1]{%
  \ifcsname\detokenize{#1}\endcsname%
    \typeout{#1 already defined}%
  \else
    \expandafter\xdef\csname\detokenize{#1}\endcsname{\the@hash@id}%
    \stepcounter{@hash@id}%
    \typeout{defining #1 now}%
  \fi
}
\makeatother

\newcommand\mytarget[1]{%
  \hashstring{#1}\hypertarget{\csname\detokenize{#1}\endcsname}{\section{#1}}}
\newcommand\mylink[1]{%
  \hashstring{#1}\hyperlink{\csname\detokenize{#1}\endcsname}{\textit{#1}}}


\begin{document}
\mytarget{Äö üß}
some text goes here
\newpage
\mylink{Äö üß}
\end{document}

相关内容