标准文本和章节通过单一标签进行交叉引用

标准文本和章节通过单一标签进行交叉引用

在我的文档中,我需要在多个部分下添加文本,并在最后的最后一个部分中重复一些文本并附带部分引用。

2 分析
2.1 评估1 结论
这里有一些初始文本,包括图片等,不再重复。
重复文本的第一个示例

2.2 评估2 结论 这里有一些初始文本,包括图片等,不再重复。
重复文本的第二个示例

3 结论
这里有一些初始文本,用于介绍不重复的部分。
重复文本的第一个示例(第 2.1 节)
重复文本的第二个示例(第 2.2 节)

我目前正在使用以下代码(来自这里)来重复达到所需功能的文本。

\documentclass[english, fontsize=11pt, DIV=12, twoside, numbers=noendperiod]{scrartcl}
\usepackage[hidelinks]{hyperref}
% Section Spacing
\RedeclareSectionCommand[beforeskip=-1sp,afterskip=12pt]{section}
\RedeclareSectionCommand[beforeskip=-1sp,afterskip=12pt]{subsection}
\RedeclareSectionCommand[beforeskip=-1sp,afterskip=12pt]{subsubsection}
\RedeclareSectionCommand[afterskip=12pt]{paragraph}
\RedeclareSectionCommand[afterskip=12pt]{subparagraph}

\newcommand\secnumindent{2cm}
\RedeclareSectionCommands[indent=-\secnumindent]{section,subsection,subsubsection,paragraph,subparagraph}

\renewcommand\sectionformat{\parbox{\secnumindent}{\thesection\autodot}}
\renewcommand\subsectionformat{\parbox{\secnumindent}{\thesubsection\autodot}}
\renewcommand\subsubsectionformat{\parbox{\secnumindent}{\thesubsubsection\autodot}}
\renewcommand\paragraphformat{\parbox{\secnumindent}{\theparagraph\autodot}}
\renewcommand\subparagraphformat{\parbox{\secnumindent}{\thesubparagraph\autodot}}

\addtolength\hoffset{\secnumindent}
\addtolength\textwidth{-\secnumindent}

\makeatletter
\newcommand*{\labelrec}[2]{%
  \begingroup
    \def\@currentlabel{#2}%
    \label{#1}%
  \endgroup
  #2%
}
\makeatother

\begin{document}
\section{Analysis}
\subsection{Assessment 1 Conclusion}\label{SecRec1}
Some initial text here with figure etc. to not be repeated.
\labelrec{Rec1}{First example of repeated text}

\subsection{Assessment 2 Conclusion}\label{SecRec2}
Some initial text here with figure etc. to not be repeated.
\labelrec{Rec2}{Second example of repeated text}

\section{Conclusions}
Some initial text here to introduce the section to not be repeated.
\ref{Rec1} (Section \ref{SecRec1})
\ref{Rec2} (Section \ref{SecRec2})
\end{document}

但是,是否可以让 \ref{} 自动进入(Section \ref{SecRec#}),这样下面的代码就足够了?

\section{Conclusions}
\ref{Rec1}
\ref{Rec2}

编辑:希望澄清问题,添加 MWE,删除提到 \Section 而不是 \section 的错误

答案1

編輯 II

下面的代码给出了我对 OP 要求的更有效方法的解释,但考虑到最后的评论,似乎我应该只是修复原始代码,而不是试图改进它,只需将 OP\labelrec中的命令替换为

\makeatletter
\newcommand*{\labelrec}[2]{%
  \begingroup
    \xdef\@currentlabel{#2 (Section \noexpand\ref{Sec#1})}%
    \label{#1}%
  \endgroup
  #2%
}
\makeatother

这假设与 OP 中一样,各小节被赋予了以下形式的标签Sec#1,其中#1是赋予 的标签\labelrec

原始解决方案

我会做得稍微不同,而是定义一个\Subsection接受两个参数的命令:

\Subsection{section name}{text to be repeated}

此命令启动(子)部分,添加“要重复的文本”,记住它,然后自动添加\label。此外,还有第二个命令\Conclusions,启动结论部分并重复所有文本。

这是代码

  \Section{Analysis}
  \Subsection{Assessment 1 Conclusion}{First example of repeated text}

  \Subsection{Assessment 2 Conclusion}{Second example of repeated text}

  \Conclusions

生产

在此处输入图片描述

超链接是使用超链接\subsection,带有蓝色链接,并通过添加以下行将“部分”添加到参考文献中

\usepackage[colorlinks, linkcolor=blue]{hyperref}
\renewcommand\subsectionautorefname{Section}

然后使用\autoref而不是 来\ref创建引用。

我在后台使用LaTeX3记住这些序列,然后复述重复的文本。以下是完整代码:

\documentclass{article}

\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \g_section_text_seq
\NewDocumentCommand\Subsection{ mm }
{
  \subsection{#1} % start the subsection
  \label{subsection\arabic{subsection}} % automatically add a label
  #2
  % finally remember the text together with a hyperlink
  \seq_put_right:Nx \g_section_text_seq { #2~(\exp_not:N \autoref{ subsection\arabic{subsection} }) }
}
\NewDocumentCommand\Conclusions{}
{
  % start the conclusions section and repeat the text
  \Section{Conclusions}
  \seq_map_inline:Nn \g_section_text_seq {##1\\}
}
\ExplSyntaxOff

\let\Section\section
\usepackage[colorlinks, linkcolor=blue]{hyperref}
\renewcommand\subsectionautorefname{Section}

\begin{document}

  \Section{Analysis}
  \Subsection{Assessment 1 Conclusion}{First example of repeated text}

  \Subsection{Assessment 2 Conclusion} {Second example of repeated text}

  \Conclusions

\end{document}

请注意,OP 中的代码为小节和重复文本创建了标签,而上面的代码仅创建一个标签,从我对您要做的事情的理解来看,这就足够了。

在没有最小工作示例,我不知道\Section应该做什么,所以我用了\section

編輯

以下是根据以下评论对原始代码的修改版本。您提到您正在使用,这很好scrartcl因为这会影响代码。要实现评论中要求的更改,现在有两个命令:

  1. \conconlusion:用于将结论添加到小节中。这既将结论添加到小节中,又“记住”它,以便可以在结论部分的顶部自动重复它。

  2. \Conclusions:这将启动结论部分并打印该小节中的结论。

有了这个,下面代码的扩展版本

  \section{Analysis I}
  \subsection{Assessment 1 Conclusion}
  \conclusion{First example of repeated text}
  \subsection{Assessment 2 Conclusion}
  \conclusion{Second example of repeated text}
  Some text in between
  \conclusion{Third example of repeated text}
  \Conclusions

产生以下输出:

在此处输入图片描述

代码使用scrartcl“钩子”会自动添加子节标签,因此无需手动添加。根据要求,结论中的链接指向相应子节的开头。如果需要,可以让每个链接指向相应的结论,而不是子节标题,但这需要更多的工作。

以下是更新后的代码:

\documentclass[english, fontsize=11pt, DIV=12, twoside, numbers=noendperiod]{scrartcl}
% Section Spacing
\RedeclareSectionCommand[beforeskip=-1sp,afterskip=12pt]{section}
\RedeclareSectionCommand[beforeskip=-1sp,afterskip=12pt]{subsection}
\RedeclareSectionCommand[beforeskip=-1sp,afterskip=12pt]{subsubsection}
\RedeclareSectionCommand[afterskip=12pt]{paragraph}
\RedeclareSectionCommand[afterskip=12pt]{subparagraph}

\newcommand\secnumindent{2cm}
\RedeclareSectionCommands[indent=-\secnumindent]{section,subsection,subsubsection,paragraph,subparagraph}

\renewcommand\sectionformat{\parbox{\secnumindent}{\thesection\autodot}}
\renewcommand\subsectionformat{\parbox{\secnumindent}{\thesubsection\autodot}}
\renewcommand\subsubsectionformat{\parbox{\secnumindent}{\thesubsubsection\autodot}}
\renewcommand\paragraphformat{\parbox{\secnumindent}{\theparagraph\autodot}}
\renewcommand\subparagraphformat{\parbox{\secnumindent}{\thesubparagraph\autodot}}

\addtolength\hoffset{\secnumindent}
\addtolength\textwidth{-\secnumindent}


% add automatic subsection labels using \xpatch
\usepackage{xpatch}
\xapptocmd\subsection\labelsubsection{}{}
\newcommand\labelsubsection{\label{subsection\thesubsection}}

\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \g_conclusion_text_seq % sequence for holding the conclusions
\NewDocumentCommand\conclusion{ m }
{
  #1 % print the text and add to \g_conclusion_text_seq
  \seq_put_right:Nx \g_conclusion_text_seq { #1~(\exp_not:N \autoref{ subsection\thesubsection }) }
}
\NewDocumentCommand\Conclusions{}
{
  % start the conclusions section and repeat the text
  \section{Conclusions}
  \seq_map_inline:Nn \g_conclusion_text_seq {##1\\}
  \seq_gclear:N \g_conclusion_text_seq
}
\ExplSyntaxOff

% hyperref should be loaded last
\usepackage[hidelinks]{hyperref}
\renewcommand\subsectionautorefname{Section}

\begin{document}

  \section{Analysis I}
  \subsection{Assessment 1 Conclusion}

  \conclusion{First example of repeated text}

  \subsection{Assessment 2 Conclusion}

  \conclusion{Second example of repeated text}

  Some text in between

  \conclusion{Third example of repeated text}

  \Conclusions

  \section{Analysis II}
  \subsection{Assessment 1 Conclusion}

  \conclusion{Another First example of repeated text}

  \subsection{Assessment 2 Conclusion}

  \conclusion{Another Second example of repeated text}

  Some text in between

  \conclusion{Another Third example of repeated text}

  \Conclusions

\end{document}

使用最新版本的斯克拉特克斯除了使用\xapptocmd添加部分标签之外,您还可以使用文档类提供的内置挂钩:

% add automatic subsection labels using \AddtoDoHook
\AddtoDoHook{heading/begingroup/subsection}{\labelsubsection}

我刚刚注意到,自最初的帖子以来,MWE 已经发生了变化,文本现在可以出现在标题Conclusions和重复的结论之间。鉴于此,定义

\NewDocumentCommand\Conclusions{}
{
  % repeat the conclusions
  \seq_map_inline:Nn \g_conclusion_text_seq {##1\\}
  \seq_gclear:N \g_conclusion_text_seq
}

并手动插入\section{Conclusions}标题。

相关内容