仅参考小节编号

仅参考小节编号

有没有办法只引用小节部分?例如:

\documentclass{article}
\begin{document}

\section{This is my section}
For further information see subsection \ref{subsecthree} within this section.
\subsection{One}
\subsection{Two}
\subsection{Three}\label{subsecthree}

\end{document}

通常给出(不带星号):

1 This is my section
For further information see subsection **1.3** within this section.

但我想要:

1 This is my section
For further information see subsection **3** within this section.

那可能吗?

[编辑] 为了使其更清楚:我正在寻找一个像 \ref 一样工作的命令,但在 \label 的位置打印子部分计数器的值(阿拉伯数字)。

========================
== LaTeX 中的解决方案 ==

下面还有另一种解决方案。这是我想到的另一种解决方案
(我无法发布我自己问题的答案,因此我将其放在这里):

\documentclass{article}

\newcommand{\labelsubseccounter}[1]{
    \renewcommand\thesubsection{\arabic{subsection}}
    \addtocounter{subsection}{-1}
    \refstepcounter{subsection}
    \label{#1}
    \renewcommand\thesubsection{\thesection.\arabic{subsection}}
}

\begin{document}

\section{This is my section}
For further information see subsection \ref{subsecthree} within this section, 
which is called \ref{onepointthree}, not \ref{onepointfour}.
\subsection{One}
\subsection{Two}
\subsection{Three}\label{onepointthree}\labelsubseccounter{subsecthree}
\subsection{Four}\label{onepointfour}

\end{document}

(我想插入编译后的代码,但不知道如何做,抱歉)

答案1

与您的 MWE 相关,您可以使用以下内容:

\documentclass{article}
\makeatletter
\def\@firstoftwo@second#1#2{%
  \def\temp##1.##2\@nil{##2}%
   \temp#1\@nil}
\newcommand\sref[1]{%
   \expandafter\@setref\csname r@#1\endcsname\@firstoftwo@second{#1}%
}

\makeatother
\begin{document}
\section{This is my section}
For further information see
\begin{tabular}{ll}
 \verb+\sref{subsecone}+   & \sref{subsecone} \\
 \verb+\sref{subsectwo}+   & \sref{subsectwo} \\
 \verb+\sref{subsecthree}+ & \sref{subsecthree} \\
\end{tabular}  within this section.
\subsection{One}\label{subsecone}
\subsection{Two}\label{subsectwo}
\subsection{Three}\label{subsecthree}
\end{document}

enter image description here


一些解释。

标准参考以以下形式保存在辅助文件中:

\newlabel{subsectwo}{{1.2}{1}}

您可以看到,这\newlabel是一个带有两个强制参数的命令。第一个参数是标签名称,第二个参数里面还有另外两个组。第一组是编号方案,第二组显示页面。

因此,您要提取第二个强制参数的第一组,然后再提取数字的第二部分。

使用该命令,\@firstoftwo@second您可以获取第二个参数的第一组\newlabel,并根据其定义提取您请求的数字。

答案2

这不是答案,我只是想添加一个子部分的版本。也许 Marco Daniel(或其他人)可以验证这是否正确(我不是这方面的专家):

\documentclass{article}

% for subsections
\makeatletter
\def\@firstoftwo@second#1#2{%
  \def\temp##1.##2\@nil{##2}%
   \temp#1\@nil}
\newcommand\sref[1]{\expandafter\@setref\csname r@#1\endcsname\@firstoftwo@second{#1}}
\makeatother

% for subsubsections
\makeatletter
\def\@firstoftwo@third#1#2{%
  \def\temp##1.##2.##3\@nil{##3}%
   \temp#1\@nil}
\newcommand\ssref[1]{\expandafter\@setref\csname r@#1\endcsname\@firstoftwo@third{#1}}
\makeatother

\begin{document}
\section{Section 1}
\section{Section 2}
\section{Section 3}\label{sec}
\subsection{Subsection}\label{subsec}
\subsubsection{Subsubsection}
\subsubsection{Subsubsection}\label{subsubsec}
Now we are in Subsubsection \ssref{subsubsec} of Subsection \sref{subsec} of
Section \ref{sec}
\end{document}

答案3

这是 @MarcoDaniel 的解决方案,适用于articleIEEEtran,有或没有hyperref。除了更通用之外,它还更强大(与 一起使用\pdfstrcmp)并返回预期结果(\hbox{}例如,从结果末尾丢弃)。还包括\subsubsections 的变体。

\ref@Mico 100% 正确,此解决方案不会以任何方式修改、等的行为\autoref\cref此外,对于hyperref,的结果\sub(sub)ref不是链接。那么我将其用于什么呢?

想象一下,在一篇文档中,某一节(例如,结果)中子节的顺序应遵循另一节(例如,材料和方法、实验)中子节的顺序。为了确保始终如此,我使用如下结构:

\section{Methods}
\subsection{...}
\label{MethodsA}
\section{Results}
\subsection{...}
\label{ResultA}
\CheckIfSubsectionsAreIdentical{MethodsA}{ResultsA}

为了实现这一点,我显然需要一种技术来从引用中提取裸露的子(子)部分编号,而不包含任何\hboxes、\nulls 或任何其他内容。这就是\sub(sub)ref的用途。有了hyperref,它就可以替代\ref*,即不提供超链接的版本。

代码如下:

\documentclass{article}
% \documentclass{IEEEtran}
% \usepackage{hyperref}

\makeatletter
\@ifclassloaded{article}{
  \def\lastoftwo@dotted#1.#2\@nil{#2}
  \def\lastofthree@dotted#1.#2.#3\@nil{#3}
  \let\submynthofm\lastoftwo@dotted
  \let\subsubmynthofm\lastofthree@dotted
}{}
\@ifclassloaded{IEEEtran}{
  \def\lastoftwo@hyphen#1-#2\@nil{#2}%
  \def\secondofthree@hyphen#1#2#3\@nil{#2}%
  \def\submynthofm#1#2#3#4\@nil{\lastoftwo@hyphen#4\@nil}%
  \def\subsubmynthofm#1#2#3#4\@nil{\secondofthree@hyphen#4\@nil}%
}{}
\@ifpackageloaded{hyperref}{
  \newcommand{\subfirstofsix}[6]{\submynthofm#1\@nil}
  \newcommand{\subsubfirstofsix}[6]{\subsubmynthofm#1\@nil}
  \newcommand\subref[1]{\expandafter\real@setref\csname r@#1\endcsname\subfirstofsix{#1}}
  \newcommand\subsubref[1]{\expandafter\real@setref\csname r@#1\endcsname\subsubfirstofsix{#1}}
}{
  \newcommand{\subfirstofthree}[3]{\submynthofm#1\@nil}
  \newcommand{\subsubfirstofthree}[3]{\subsubmynthofm#1\@nil}
  \newcommand\subref[1]{\expandafter\@setref\csname r@#1\endcsname\subfirstofthree{#1}}
  \newcommand\subsubref[1]{\expandafter\@setref\csname r@#1\endcsname\subsubfirstofthree{#1}}
}
\@ifclassloaded{article}{
  \newcommand{\subrefvalue}{3}
  \newcommand{\subsubrefvalue}{4}
}{}
\@ifclassloaded{IEEEtran}{
  \newcommand{\subrefvalue}{C}
  \newcommand{\subsubrefvalue}{4}
}{}
\makeatother

\begin{document}
Last subsection is \subref{subsec:last}, 
\ifnum\pdfstrcmp{\subrefvalue}{\subref{subsec:last}}=0 OK! \else Error! \fi

Last subsubsection is \subsubref{subsubsec:last}, 
\ifnum\pdfstrcmp{\subsubrefvalue}{\subsubref{subsubsec:last}}=0 OK! \else Error! \fi

\section{Section}
\section{Section}
\subsection{Subsection}
\subsection{Subsection}
\subsection{Subsection}
\label{subsec:last}
\subsubsection{Test}
\subsubsection{Test}
\subsubsection{Test}
\subsubsection{Test}
\label{subsubsec:last}

\end{document}

答案4

感谢您的提问,您的解决方案对我有用。我不得不做出调整,因为有两个问题:(1) 文章使用的IEEEtran文档类别包含 IA1、IA2、II.A.1 等章节;(2) 我想引用不带章节编号的 subsection.subsubsection(例如 A.1、B.3 等)。

然后我将您的解决方案调整为:

\documentclass[conference]{IEEEtran}

\newcommand{\labelsubseccounter}[1]{
    \renewcommand\thesubsubsection{\Alph{subsection}.\arabic{subsubsection}}
    \addtocounter{subsubsection}{-1}
    \refstepcounter{subsubsection}
    \label{#1}
    \renewcommand\thesubsubsection{\thesection.\Alph{subsection}.\arabic{subsubsection}}
}

\begin{document}
    
    \section{This is my section}
    For further information see subsection \ref{subsecthree} within this section, 
    which is called \ref{onepointthree}, not \ref{onepointfour}.
    \subsection{A}
    \subsection{B}
    \subsection{C}
    \subsubsection{C1}\label{onepointthree}\labelsubseccounter{subsecthree}
    \subsection{D}\label{onepointfour}
    
\end{document}

希望这能帮助其他像我一样需要适应这一点的人。

相关内容