我想为所有类型的节(部分、章节、节、小节、段落等)配置节符号 §(单数和复数形式 §§)。我使用包cleveref
,但我不想进行这种类型的自定义:
\crefname{part}{\S}{\S\S}
\crefname{chapter}{\S}{\S\S}
\crefname{section}{\S}{\S\S}
\crefname{subsection}{\S}{\S\S}
...
如何为所有调用配置§和§§ \cref
,而不管引用类型如何?
我一直在cleveref
文档中搜索,但我还没有找到/明白如何做到这一点。
答案1
\makeatletter
\newcommand{\crefnames}[3]{%
\@for\next:=#1\do{%
\expandafter\crefname\expandafter{\next}{#2}{#3}%
}%
}
\makeatother
\crefnames{part,chapter,section}{\S}{\S\S}
您可以使用任何分段命令集;这对于较低级别来说已经足够了。如果您想对\paragraph
和使用不同的符号\subparagraph
,只需执行
\crefnames{part,chapter,section}{\S}{\S\S}
\crefnames{paragraph}{\P}{\P\P}
来自 lockstep 的完整示例:
\documentclass{book}
\usepackage{cleveref}
\makeatletter
\newcommand{\crefnames}[3]{%
\@for\next:=#1\do{%
\expandafter\crefname\expandafter{\next}{#2}{#3}%
}%
}
\makeatother
\setcounter{secnumdepth}{100}
\crefnames{part,chapter,section}{\S}{\S\S}
\crefnames{paragraph,subparagraph}{\P}{\P\P}
\begin{document}
\chapter{foo}\label{sec:f}
\section{foobar}\label{sec:fb}
\subsection{foobargnu}\label{sec:fbg}
\subsubsection{foobargnugnat}\label{sec:fbgg}
\subsubsection{foobargnugnat2}\label{sec:fbgg2}
These are references to \cref{sec:f}, \cref{sec:fb}, \cref{sec:fbg}, and \cref{sec:fbgg,sec:fbgg2}.
\paragraph{par}\label{par:p}
\subparagraph{subpar}\label{par:sp}
\subparagraph{subpar2}\label{par:sp2}
References to paragraphs: \cref{par:p}, \cref{par:sp,par:sp2}.
\end{document}
为了避免分段单位列表中出现空格问题,可以使用xparse
:
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\crefnames}{ m m m }
{
\clist_map_inline:nn { #1 } { \crefname{##1}{#2}{#3} }
}
\ExplSyntaxOff
你在自我回答中使用的更复杂的方式可以写成
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\crefnames}{ m m m }
{
\clist_map_inline:nn { #1 }
{
\crefformat{##1}{#2####2####1####3}
\crefmultiformat{##1}
{#3####2####1####3}
{and~####2####1####3}
{, ####2####1####3}
{, and~####2####1####3}
}
}
\ExplSyntaxOff
答案2
我相信这是习惯不是\S
在(复数形式)生成的节符号\S\S
和相关数字 (或数字) 之间留一个空格。要使用 的cleveref
交叉引用命令实现此结果,必须使用“低级”控件\crefformat
和\crefmultiformat
;我认为,依赖“高级”控件\crefname
并不能完全实现这一目标。以下 MWE 是 lockstep 示例的修改形式:
\documentclass{book}
\usepackage{cleveref}
\crefformat{chapter}{\S#2#1#3}
\crefmultiformat{chapter}{\S\S#2#1#3}{ and~#2#1#3}{, #2#1#3}{, and~#2#1#3}
\crefformat{section}{\S#2#1#3}
\crefmultiformat{section}{\S\S#2#1#3}{ and~#2#1#3}{, #2#1#3}{, and~#2#1#3}
\setcounter{secnumdepth}{3}
\begin{document}
\chapter{foo}\label{sec:f}
\section{foobar}\label{sec:fb}
\subsection{foobargnu}\label{sec:fbg}
\subsubsection{foobargnugnat}\label{sec:fbgg}
These are cross-references to \cref{sec:f} and to \cref{sec:fb,sec:fbg,sec:fbgg}.
This is how it looks like with just two \cref{sec:fbg,sec:fbgg}
\end{document}
答案3
该cleveref
软件包不包含内置方法,可以使用“单击”宏重新定义所有节级的交叉引用格式。但是,引用手册第 7.1.2 节的内容,
[f]为方便起见,如果在序言结尾之前它们没有被定制,则 的交叉引用名称(和标签格式)默认
subsection
从 继承section
,而 的交叉引用名称(和标签格式)subsubsection
从 继承subsection
(而 本身可能从 继承section
)。 类似地,对于subappendix
、subsubappendix
和subsubsubappendix
,以及enumii
、enumiii
和,它们enumiv
也enumv
从 继承enumi
。最后,subfigure
和分别从和subtable
继承。figure
table
\documentclass{book}
\usepackage{cleveref}
\crefname{chapter}{\S}{\S\S}
\crefname{section}{\S}{\S\S}
\setcounter{secnumdepth}{3}
\begin{document}
\chapter{foo}\label{sec:f}
\section{foobar}\label{sec:fb}
\subsection{foobargnu}\label{sec:fbg}
\subsubsection{foobargnugnat}\label{sec:fbgg}
These are references to \cref{sec:f}, \cref{sec:fb}, \cref{sec:fbg}, and \cref{sec:fbgg}.
\end{document}
答案4
混合@Mico、@lockstep 和@egreg 的贡献,这是我实际的集成定制:
\newcommand{\crefnames}[3]{%
\@for\next:=#1\do{%
\expandafter\crefformat\expandafter{\next}{#2##2##1##3}
\expandafter\crefmultiformat\expandafter{\next}
{#3##2##1##3}{and~##2##1##3}{, ##2##1##3}{, and~##2##1##3}
}%
}
\setcounter{secnumdepth}{100}
\crefnames{part,section}{\S}{\S\S}
\crefnames{paragraph}{\P}{\P\P}
最后,关于这一点的一个问题:如果我在 crefnames 列表中放置一个空格,则只会取第一个元素:例如,仅在 \crefnames{part, section}{\S}{\S\S} 中部分已配置。为什么?