
スタイルの先頭に相互参照セクションが必要なドキュメントに取り組んでいます。
- 証拠1は1.1、1.2、1.3項に記載されている。
- 証拠2は1.2、2.3、3.4項に見つかりました
等
\label
ドキュメントのフォーマットが適切に設定されており、とを使用して個々の段落を希望どおりに参照できます\ref
。
\ref
ただし、ラベルを複数回定義して、呼び出されたときに、最後のラベルだけでなく (現在行われているように) すべてのラベルのリストを印刷できるようにしたいと考えています。
これにインデックスを使用することを検討しましたが、カスタム出力はもちろん、最も単純な形式でも動作しないようです。
\label
複数回定義できるようにする方法はありますか?
答え1
\documentclass{article}
\makeatletter
\def\@newl@bel#1#2#3{{%
\@ifundefined{#1@#2}%
{\def\tmp{#3}}%
{%
\edef\tmp{%
{\expandafter\expandafter\expandafter\@firstoftwo\csname#1@#2\endcsname,
\@firstoftwo#3}%
{\expandafter\expandafter\expandafter\@secondoftwo\csname#1@#2\endcsname,
\@secondoftwo#3}%
}}%
\expandafter\xdef\csname#1@#2\endcsname{\tmp}%
}}
\def\@testdef #1#2#3{}
\makeatother
\begin{document}
good stuff in section(s) \ref{a}
bad stuff in section(s) \ref{b}
\section{zz}\label{a}
zz
\section{zzz}\label{a}
zzz
\section{zzzz}\label{a}
zzzz
\section{aaa}\label{b}
aaa
\section{zzzzz}\label{a}
zzzzz
\end{document}
答え2
必ずしも複数のラベルを許可する必要はありません。@DavidCarlisle のクールな低レベル ハックに加えて、内部で作成されたリストをループするこのソリューション (基本的には と呼ばれるカスタム相互参照マクロ\eref{<evidence no>}{<label>}
) を提供します。
\documentclass{article}
\usepackage{etoolbox}
\usepackage{lipsum}
\makeatletter
\newcounter{para}
\renewcommand{\thepara}{\thesection.\@arabic\c@para}
\let\svd@paragraph=\paragraph
\renewcommand{\paragraph}{\refstepcounter{para} \svd@paragraph}
\newcommand{\eref}[2]{%
\ifcsundef{evlist#1}{\@namedef{evlist#1}{}}{}
\def\process{\def\process{,}}%
\def\do##1{\process\ref{##1}}%
\expandafter\listadd\csname evlist#1\endcsname{#2}%
Evidence #1 found at paragraph
\expandafter\dolistloop\csname evlist#1\endcsname}
\makeatother
\begin{document}
\section{First Section}
\paragraph{One}\label{para:1}
\lipsum[1]
\eref{1}{para:1}
\paragraph{Two}\label{para:2}
\lipsum[2]
\eref{1}{para:2}
\paragraph{Three}\label{para:3}
\lipsum[3]
\eref{2}{para:3}
\end{document}
\paragraph
(ドキュメント構造で を使用しない場合は、6 ~ 9 行目を使用する必要がないことに注意してください。)