我的文档包含部分和章节。例如,当我引用第 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}