根据相应 \label 的位置更改 \ref 的输出

根据相应 \label 的位置更改 \ref 的输出

我的文档包含部分和章节。例如,当我引用第 I.1 节时,\ref如果它位于第 I 部分,我希望输出 1,否则输出 I.1。因此,我希望我的文档看起来像:

一、第一部分
1 第一节
2 第二节
参考第一部分第一节: 1

II. 第二部分
1 第一节
参考第一部分第一节:I.1

下列的此链接,这是我尝试过的。首先,我使用,\counterwithin*这样每次增加部分时都会重置部分。然后,我更改\p@section为将零件编号添加到对部分的引用中。最后,我定义\newref,这应该在不需要零件编号时删除它。因此我们得到:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{chngcntr}
\usepackage{xstring}
\usepackage{refcount}

\counterwithin*{section}{part}
\makeatletter
\renewcommand\p@section{\thepart.}
\makeatother

\newcommand\newref[1]{%
  \IfRefUndefinedExpandable{#1}{\refused{#1}\textbf{??}}{%
    \edef\temp{\expandafter\detokenize\getrefnumber{#1}}%
    \IfStrEq{\thepart}{\StrBefore\temp.}{%
      \StrBehind\temp.}{%
      \temp}}}

\begin{document}

\part{First part}

\section{First section}

\label{sec:fst}

\section{Second section}

Reference to the first section of the first part : \newref{sec:fst}

\part{Second part}

\section{First section}

Reference to the first section of the first part : \newref{sec:fst}

\end{document}

但是,上面的代码失败并显示“!缺少{插入),原因我不明白。

因此,总结一下,我将非常感激:
1)了解为什么我的代码不起作用;
2)找到我的问题的解决方案。

提前谢谢了。

答案1

这个方法可行,但是会调用\getrefnumber三次。我会尝试改进。

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{chngcntr}
\usepackage{xstring}
\usepackage{refcount}

\counterwithin*{section}{part}
\makeatletter
\renewcommand\p@section{\thepart.}

%\newcommand\newref[1]{%
%  \IfRefUndefinedExpandable{#1}{\refused{#1}\textbf{??}}{%
%    \edef\temp{\expandafter\detokenize\getrefnumber{#1}}%
%    \IfStrEq{\thepart}{\StrBefore\temp.}{%
%      \StrBehind\temp.}{%
%      \temp}}}

\newcommand{\newref}[1]{%
  \IfRefUndefinedExpandable{#1}{\refused{#1}\textbf{??}}{%
    \StrBefore{\getrefnumber{#1}}{.}[\part@number]
    \StrBehind{\getrefnumber{#1}}{.}[\section@number]
    \IfStrEq{\thepart}{\part@number}{%
      \section@number%
    }{%
      \getrefnumber{#1}%
    }%
  }%
}

\makeatother


\begin{document}

\part{First part}

\section{First section}

\label{sec:fst}

\section{Second section}

Reference to the first section of the first part : \newref{sec:fst} and \newref{sec:other}

\part{Second part}

\section{First section}

Reference to the first section of the first part : \newref{sec:fst}

\end{document}

编辑不调用三次的版本\getrefnumber{#1}

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{chngcntr}
\usepackage{xstring}
\usepackage{refcount}

\counterwithin*{section}{part}
\makeatletter
\renewcommand\p@section{\thepart.}

\newcommand{\newref}[1]{%
  \IfRefUndefinedExpandable{#1}{\refused{#1}\textbf{??}}{%
    \edef\temp{\getrefnumber{#1}}%
    \StrBefore{\temp}{.}[\part@number]
    \StrBehind{\temp}{.}[\section@number]
    \IfStrEq{\thepart}{\part@number}{%
      \section@number%
    }{%
      \temp%
    }%
  }%
}

\makeatother


\begin{document}

\part{First part}

\section{First section}

\label{sec:fst}

\section{Second section}

Reference to the first section of the first part : \newref{sec:fst} and \newref{sec:other}

\part{Second part}

\section{First section}

Reference to the first section of the first part : \newref{sec:fst}

\part{Third part}

\section{First section} \label{sec:third}

Reference to the first section of the 3rd part : \newref{sec:third}


\end{document}

在此处输入图片描述

相关内容