从 \ref{label} 中取出第一个字符并处理它是否是数字

从 \ref{label} 中取出第一个字符并处理它是否是数字

我的任务是检测传递了哪种节引用:之前还是\appendix之后。附录 [sub[sub]] 节以字符开头。见下文:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{color,xstring,etoolbox}

\newcommand{\getFirstChar}[1]{\StrChar{\ref{#1}}{1}}
\makeatletter%
\newcommand{\makeinbestway}[1]{%
    \in@{\getFirstChar{#1}}{1,2,3,4,5,6,7,8,9}% <<-- Need conversion of first char...
    \ifin@%
        Section~\ref{#1}%
    \else%
        Appendix~\ref{#1}%
    \fi%
}%
\makeatother


\begin{document}
    \section{Test}
    
    
    \section{Introduction}\label{lbl1}
    \subsection{}
    \makeinbestway{lbl1}.
    
    \subsection{}
    \makeinbestway{lbl2} but it should be \textcolor{red}{\texttt{Appendix~\ref{lbl2}}}. % <<-- ??
    
    \appendix
    \section{Conclusion}\label{lbl2}
\end{document}

答案1

也许你应该使用cleveref可以自动选择章节和附录的包,只需输入

\cref{lbl1} \cref{lbl1}

您可以\Cref在句子开头使用以获得大写版本。如果您希望所有引用都大写,请使用

\usepackage[capitalize]{cleveref}

答案2

我会cleveref像 Don 建议的那样使用。无论如何,您可以使用它refcount来检查第一个字符。

\documentclass{article}
\usepackage{refcount}

\ExplSyntaxOn

\NewDocumentCommand{\tref}{m}
 {
  \regex_match:nxTF { \A [[:alpha:]] } { \getrefnumber { #1 } }
   { Appendix\nobreakspace }
   { Section\nobreakspace }
  \ref{#1}
 }
\prg_generate_conditional_variant:Nnn \regex_match:nn { nx } { T, F, TF }

\ExplSyntaxOff

\begin{document}

\section{Test}

\section{Introduction}\label{lbl1}

\subsection{Title}

\tref{lbl1}.

\subsection{Titls}

\tref{lbl2}

\appendix
\section{Conclusion}\label{lbl2}

\end{document}

“搜索表达式”的\A [[:alpha:]]意思是“在给定的标记列表中寻找一个字母作为第一个项目。

在此处输入图片描述

您也可以使用和来执行此操作xstringin@refcount无论如何,为了获得和的可扩展版本\ref并对字符串进行预处理,这都是必要的。

\documentclass{article}
\usepackage{xstring,refcount}

\newcommand{\getFirstChar}[1]{\StrChar{\ref{#1}}{1}}

\makeatletter
\newcommand{\makeinbestway}[1]{%
  \StrChar{\getrefnumber{#1}}{1}[\temp]%
  \expandafter\in@\expandafter{\temp}{1,2,3,4,5,6,7,8,9}%
  \ifin@
    Section~\ref{#1}%
  \else
    Appendix~\ref{#1}%
  \fi
}
\makeatother


\begin{document}

\section{Test}

\section{Introduction}\label{lbl1}
\subsection{Title}
\makeinbestway{lbl1}.

\subsection{Title}
\makeinbestway{lbl2}

\appendix
\section{Conclusion}\label{lbl2}

\end{document}

答案3

您可以使用 hyperref \autoref
(对于下面的示例,我创建了变体\makeinbestway\MAKEinbestway
进一步的类似\autoref并保留引用短语的第一个字母。
后者适用\MakeUppercase于引用短语的第一个标记。
只要引用短语的第一个字母由单个标记而不是由多个标记组成,这可能会奏效。(后者可能是这种情况,例如,使用传统的 TeX 引擎通过 inputenc-package 处理 utf8 字符。)
您不能在 pdf 字符串中使用这些命令。)

\RequirePackage{xparse}
\documentclass{article}

% In case you wish no hyperlinks and no bookmarks within the entire document:
%\PassOptionsToPackage{bookmarks=false}{hyperref}%
%\AtBeginDocument{\NoHyper}%
%
%  (I know that \NoHyper actually belongs to the NoHyper environment.
%   But NoHyper is an environment only because you normally want to
%   disable the creation of hyperlinks only locally. But since I don't
%   want to disable creation of hyperlinks locally, but for the whole 
%   document, I use the command directly.)
%
\usepackage{hyperref}
\usepackage[utf8]{inputenc}
\usepackage{color,xstring,etoolbox}

\makeatletter
\renewcommand*\appendixautorefname{appendix}%
\NewDocumentCommand\makeinbestway{}{\autoref}%
\NewDocumentCommand\MAKEinbestway{sm}{%
  \@ifundefined{r@#2}{\refused{#2}\nfss@text{\reset@font\bfseries??}}{%
     \expandafter\expandafter\expandafter\HyRef@testreftype\getrefbykeydefault{#2}{anchor}{}.\\%
     \IfBooleanTF{#1}{\@firstofone}{\hyperref[{#2}]}%
     {%
        \ifx\HyRef@currentHtag\empty\else
        \expandafter\expandafter\expandafter\MakeUppercase\HyRef@currentHtag
        \fi
        \ref*{#2}%
     }%
  }%
}%
\makeatother


\begin{document}
    \section{Test}
    
    
    \section{Introduction}\label{lbl1}
    \subsection{}
    \makeinbestway{lbl1}

    \MAKEinbestway{lbl1}

    \makeinbestway*{lbl1}

    \MAKEinbestway*{lbl1}

    
    \subsection{}
    \makeinbestway{lbl2}

    \MAKEinbestway{lbl2}

    \makeinbestway*{lbl2}

    \MAKEinbestway*{lbl2}

    
    \appendix
    \section{Conclusion}\label{lbl2}
\end{document}

在此处输入图片描述

相关内容