我正在尝试编写一个小程序包(作为次要子功能),其中包含一些 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
您的方法实际上存在两个问题/错误:
宏
\hyper…
要求第一个参数完全可扩展。您的\hashstring
宏不是这样的。(\typeout
??\stepcounter
)但是你的
\csname #1\endcsname
是一个(它只包含计数器)。我的解决方案:您的
\my…
宏#1
在宏之外进行处理\hyper…
(即,\csname #1\endcsname
如有必要,创建)并直接\hyper…
使用。\csname #1\endcsname
变音符号问题。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}