cleveref:一次性为所有分段类型配置符号§/§§

cleveref:一次性为所有分段类型配置符号§/§§

我想为所有类型的节(部分、章节、节、小节、段落等)配置节符号 §(单数和复数形式 §§)。我使用包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)。 类似地,对于subappendixsubsubappendixsubsubsubappendix,以及enumiienumiii和,它们enumivenumv从 继承enumi。最后, subfigure和分别从和subtable继承。figuretable

\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} 中部分已配置。为什么?

相关内容