我正在编写一份文档,其中包含一组描述一些技术对象的部分。对象名称包含下划线(在该编程环境中非常常见),因此我加载了包underscore
。
现在我想从文档的其他部分链接到参考部分。标签中的下划线(例如\label{sec:ref-struct-FOO_BAR}
)似乎会引起各种麻烦,所以我只需将标签中的下划线替换为破折号:\label{sec:ref-struct-FOO-BAR}
。到目前为止,这种方法有效。
下一步,我想提供一个自定义宏,该宏使用对象名称(包含下划线)进行调用,然后两个宏都排版该名称(带有下划线)并放置一个链接(其中所有下划线都替换为破折号)。示例:
\documentclass{article}
\usepackage{fancyref}
\usepackage{hyperref}
\usepackage{underscore}
\newcommand{\componentname}[1]{\texttt{#1}}
\newcommand{\structurename}[1]{\texttt{#1}}
\newcommand{\componentref}[2]{\hyperref[sec:ref-comp-#1]{\componentname{#2}}}
\newcommand{\structureref}[2]{\hyperref[sec:ref-struct-#1]{\structurename{#2}}}
\begin{document}
\tableofcontents
\clearpage
\section{Text}
% Where I came from:
We use component \componentname{AB_CD} (see \fref{sec:ref-comp-AB-CD}) to generate
structure \structurename{FOO_BAR} (see \fref{sec:ref-struct-FOO-BAR}).
% How far I got:
We use component \componentref{AB-CD}{AB_CD} to generate structure \structureref{FOO-BAR}{FOO_BAR}.
% What I really want:
% We use component \componentref{AB_CD} to generate structure \structureref{FOO_BAR}.
\section{Reference}
\subsection{Structures}
\subsubsection{Structure \structurename{FOO_BAR}}
\label{sec:ref-struct-FOO-BAR}
Text
\subsubsection{Structure \structurename{BOO_FAR}}
\label{sec:ref-struct-BOO-FAR}
Text
\subsection{Components}
\subsubsection{Component \componentname{AB_CD}}
\label{sec:ref-comp-AB-CD}
Text
\subsubsection{Component \componentname{EFG_HIJ}}
\label{sec:ref-comp-EFG-HIJ}
Text
\end{document}
我想使用类似
\usepackage{xstring}
% ...
\newcommand{\fancycomponentref}[1]{\hyperref[sec:ref-comp-\StrSubstitute{#1}{_}{-}]{\componentname{#1}}}
但那不起作用,我还没有找到可行的解决方案。我有什么选择可以实现这一点?
答案1
您不需要该underscore
包:
\documentclass{article}
\usepackage{fancyref}
\usepackage{hyperref}
\newcommand{\componentname}[1]{\texttt{#1}}
\newcommand{\structurename}[1]{\texttt{#1}}
\newcommand{\componentref}[1]{\hyperref[sec:ref-comp-#1]{\componentname{#1}}}
\newcommand{\structureref}[1]{\hyperref[sec:ref-struct-#1]{\structurename{#1}}}
\begingroup\lccode`~=`_ \lowercase{\endgroup\let~}_
\catcode`_=12
\begin{document}
\tableofcontents
\clearpage
\section{Text}
% Where I came from:
We use component \componentname{AB_CD} (see \fref{sec:ref-comp-AB_CD}) to generate
structure \structurename{FOO_BAR} (see \fref{sec:ref-struct-FOO_BAR}).
% How far I got:
We use component \componentref{AB_CD} to generate structure \structureref{FOO_BAR}.
\section{Reference}
\subsection{Structures}
\subsubsection{Structure \structurename{FOO_BAR}}
\label{sec:ref-struct-FOO_BAR}
Text and math $a_1$
\subsubsection{Structure \structurename{BOO_FAR}}
\label{sec:ref-struct-BOO_FAR}
Text
\subsection{Components}
\subsubsection{Component \componentname{AB_CD}}
\label{sec:ref-comp-AB_CD}
Text
\subsubsection{Component \componentname{EFG_HIJ}}
\label{sec:ref-comp-EFG_HIJ}
Text
\end{document}