在宏实现中替换下划线?

在宏实现中替换下划线?

我正在编写一份文档,其中包含一组描述一些技术对象的部分。对象名称包含下划线(在该编程环境中非常常见),因此我加载了包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}

在此处输入图片描述

相关内容