我的任务是检测传递了哪种节引用:之前还是\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:]]
意思是“在给定的标记列表中寻找一个字母作为第一个项目。
您也可以使用和来执行此操作xstring
,in@
但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}