雾月
雾月
这家伙很懒,什么也没写!

注册于 4年前

回答
219
文章
2
关注者
23

\the<section> 后加一个 * 即可。

具体的,类似于:

\expandafter\def\expandafter\thesection\expandafter{\thesection*}

这里使用 \expandafter 是为了展开 \thesection 一次。
当然使用

\let\old@thesection\thesection
\def\thesection{\old@thesection*}

也可以。不过在使用之后必须立刻恢复 \thesection 的定义。

按照这个思路,可以写一个通用的宏 \starthis

\NewDocumentCommand \starthis { s m s o +m }
  {
    \group_begin:
    \exp_args:Nnf \cs_set:cpn { the \cs_to_str:N #2 } 
      { 
        \exp_after:wN \exp_after:wN \exp_after:wN 
        \exp_stop_f: \cs:w the \cs_to_str:N #2 \cs_end: * 
      }
    \IfBooleanT {#1}
      {
        \exp_args:Nnf \cs_set:cpn { CTEXthe \cs_to_str:N #2 } 
          { 
            \exp_after:wN \exp_after:wN \exp_after:wN 
            \exp_stop_f: \cs:w CTEXthe \cs_to_str:N #2 \cs_end: * 
          }
      }
    \IfBooleanTF {#3}
      { \IfValueTF {#4} { #2 * [#4] } { #2 * } }
      { \IfValueTF {#4} { #2   [#4] } { #2   } }
      {#5}
    \group_end:
  }
\ExplSyntaxOff

使用时只需

\starthis\chapter{章}

\starthis*\chapter{章}

\starthis\chapter[张]{章}

\starthis\section{节}

\starthis\subsection{小节}

* 的还会重定义 \CTEXthe<section>,以使得 \CTEXthe<section> 也有效。
对于完整的 \starthis\<section>*[...]{...} 也是支持的。

完整示例:

\documentclass{ctexart}
\usepackage{zhlipsum}
\usepackage[colorlinks]{hyperref}
\ExplSyntaxOn
\NewDocumentCommand \starthis { s m s o +m }
  {
    \group_begin:
    \exp_args:Nnf \cs_set:cpn { the \cs_to_str:N #2 } 
      { 
        \exp_after:wN \exp_after:wN \exp_after:wN 
        \exp_stop_f: \cs:w the \cs_to_str:N #2 \cs_end: \,* 
      }
    \IfBooleanT {#1}
      {
        \exp_args:Nnf \cs_set:cpn { CTEXthe \cs_to_str:N #2 } 
          { 
            \exp_after:wN \exp_after:wN \exp_after:wN 
            \exp_stop_f: \cs:w CTEXthe \cs_to_str:N #2 \cs_end: \,* 
          }
      }
    \IfBooleanTF {#3}
      { \IfValueTF {#4} { #2 * [#4] } { #2 * } }
      { \IfValueTF {#4} { #2   [#4] } { #2   } }
      {#5}
    \group_end:
  }
\ExplSyntaxOff

\begin{document}

\tableofcontents

\section{章一}

\begingroup
\expandafter\def\expandafter\thesubsection\expandafter{\thesubsection\,*}
\subsection{章一一}
\endgroup

\zhlipsum[1-2][name=zhufu]

\subsection{章一二}

\zhlipsum[4-6][name=zhufu]

\starthis\subsection{章一三}

\zhlipsum[7-9][name=zhufu]


\starthis\section{章二}

\subsection{章二一}

\zhlipsum[1-3][name=nanshanjing]

\starthis\subsection[章两两]{章二二}


\zhlipsum[4-7][name=nanshanjing]

\end{document}

image.png
image.png

有一个 tableof 宏包,不知道是不是你想要的。效果如下:
image.png

多 tag 也是支持的。

如果只是要在标题旁边标记tag,那应该由 titlesecctexheading 宏包来做。

附上代码:

\documentclass{article}
\usepackage{tableof}
\usepackage{lipsum}

\begin{document}

\tableofcontents

\section*{Tagged with `\texttt{sec1}'}
\tableof{sec1}

\section*{Tagged with `\texttt{subsec1}'}
\tableof{subsec1}

\section*{Tagged with `\texttt{subsec2}'}
\tableof{subsec2}


\toftagstart{sec1}

\section{lipsum 1}

\toftagthis{subsec1}
\subsection{lipsum 1.1}

\lipsum[1]

\toftagthis{subsec2}
\subsection{lipsum 1.2}

\lipsum[1]

\toftagstop{sec1}


\toftagstart{sec2}

\section{lipsum 2}

\toftagthis{subsec1}
\subsection{lipsum 2.1}

\lipsum[2]

\toftagthis{subsec2}
\subsection{lipsum 2.2}

\lipsum[2]

\toftagstop{sec2}


\toftagstart{sec3}

\section{lipsum 3}

\toftagthis{subsec1}
\subsection{lipsum 3.1}

\lipsum[3]

\toftagthis{subsec2}
\subsection{lipsum 3.2}

\lipsum[3]

\toftagstop{sec3}


\toftagstart{sec4}

\section{lipsum 4}

\toftagthis{subsec1}
\subsection{lipsum 4.1}

\lipsum[4]

\toftagthis{subsec2}
\subsection{lipsum 4.2}

\lipsum[4]

\toftagstop{sec4}

\end{document}

\documentclass{standalone}

\usepackage{forest}

\begin{document}

\forestset{
  declare dimen register=itemize folder indent,
  itemize folder indent=.6em,
  itemize rect/.style={tikz+={\fill ([xshift=-.9em,yshift=-2pt].child anchor) circle(1pt);}},
  itemize folder/.style={
    parent anchor=-children last,
    anchor=parent first,
    calign=child,
    calign primary child=1,
    for descendants={itemize rect},
    for children={
      child anchor=parent,
      anchor=parent first,
      edge={rotate/.option=!parent.grow},
      edge path={
        \noexpand\path[\forestoption{edge}]([xshift=\forestregister{itemize folder indent}]!u.parent anchor) |- ([yshift=-2pt].child anchor)\forestoption{edge label};
      },
    },
    after packing node={
      if n children=0{}{
        tempdiml=l_sep()-l("!1"),
        tempdims={-abs(max_s("","")-min_s("",""))-s_sep()},
        for children={
          l+=tempdiml,
          s+=tempdims()*(reversed()-0.5)*2,
        },
      },
    },
  }
}

\begin{forest}
    for root={itemize folder indent=.8em},
    for tree={grow'=0,itemize folder,font=\ttfamily,inner ysep=0pt,l sep=1.7em}
    [Baby Linear Functional analysis
      [normed space
        [$L^p$ space]
        [Banach fixed point theorem]
        [Hahn-Banach theorem
          [separation of convex sets]
          [weak convergence/dual operator,inner ysep=-2.5pt]
          [Banach-Mazur theorem]
          [Banach-Alaoglu-Bourbaki Theorem]
        ]
        [Baire Category theorem
          [Uniform boundedness principle]
          [Open mapping theorem]
          [Closed graph theorem]
        ]
      ]
      [Hilbert space
        [projections]
        [Riesz representation]
        [Fourier series]
        [Lax-Milgram theorem]
        [Self adjoint operators
          [Eigenvalue problem]
          [Spectral theorem]
        ]
      ]
    ]
\end{forest}

\end{document}

间距自己调吧。
image.png

在 xelatex 下,xeCJK 宏包有一个 CheckSingle 选项用以控制是否检查段末的孤字。

\documentclass[zihao=-4]{ctexart}
% 480bp = 40*12bp % 每行40字
\usepackage[textwidth=480bp]{geometry}
\begin{document}

\noindent
一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十

\medskip

一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九。%十

\xeCJKsetup{CheckSingle=true}

一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九。%十

\end{document}

image.png

可以看到使用 CheckSingle 的不同之处。“只有在段末的最后一个字是 CJK 文字或者标点符号,并且倒数第二和第三个字都是文字才能正确处理”。

对于单句在一个页面,可以使用 \enlargethispage{<dim>} 暂时扩大该页的高度。如

文字
\enlargethispage{12bp}

如果只是想得到 title、author 等信息,可以

\def\recordinfo#1{\gdef\recordedinfo{#1}#1}

然后使用

\recordinfo{%
\title{...}%
\author{...}%
\date{...}%
}

这样就把它们保存到了 \recordedinfo 之中,\maketitle 同样可用。

实际上,标准类文档中 title 等信息被保存到了 \@title\@author\@date 之中,在 \maketitle 之前可以使用它们,如果你用的文档类没有重定义 \title 等命令的话。

第一个例子中,\@title 就是

The Triangulation of Titling Data in Non-Linear Gaussian Fashion via $\rho$ Series\thanks{No procrastination}

当然也可以使用 regexpatch 宏包的 \xpretocmd 将信息保存到自己的命令中

% \usepackage{regexpatch} % 或者\usepackage{xpatch}
\xpretocmd\title{\gdef\titlesaved{#1}}{}{}

\titlesaved 中也会保存相同的标题信息。

至于它们的显示与否和显示顺序,这是由 \maketitle 或类似的命令来完成的。
可以使用 \meaning\maketitle (或者 \show\maketitle)查看其定义,在标准类文档中是由 \@maketitle 完成的,它决定了标题信息的输出顺序。

这些标题信息在每个文档类中都不一样,而且有些文档类不只有 title、author、date 信息,要设计一个通用的命令几乎是不可能的,只能靠人工查找,当然这还不如直接排版出来,再记住它们的顺序。

可能是使用了 fancyvrb 宏包的 \DefineShortVerb 命令将 | 定义为了 verb 命令。
我使用这种方式复现了类似的错误。

这样的话可以将 | 的类代码改为 12:

\catcode`\|=12
... 公式 ...

另外你可以使用

\the\catcode`\|

查看 | 的类代码,如果其值是 13 则应该可以通过上述方式修复。

如果还不能解决,请提供 MWE。

看看这个 https://www.zhihu.com/question/501741864/answer/2244093701
原理是相同的,只要把它的 sidenote 计数器改为你的计数器即可。

使用 \phantomsection\addcontentsline

\documentclass{book}

\usepackage[colorlinks]{hyperref}
\usepackage{bookmark}
\usepackage{lipsum}

\begin{document}

% \hypersetup{pdfview=Fit}
\phantomsection
\addcontentsline{toc}{chapter}{Page One}
\begin{center}
\begin{minipage}{.7\textwidth}
{\hfill\bfseries\large Abstract\hfill}
\medskip

\parindent=2em
\small
\lipsum[11-12]
\end{minipage}
\end{center}


\cleardoublepage
% \hypersetup{pdfview=XYZ}
\phantomsection
\addcontentsline{toc}{chapter}{Contents}
\tableofcontents


\chapter{Chapter One}

\lipsum[1-3]

\section{Section One.One}

\lipsum[4-9]

\section{Section One.Two}

\chapter{Chapter Two}

\lipsum[10-13]

\end{document}

image.png
image.png

cmap是pdftex特有的功能,其它编译器不可用。

你之前那个问题是pdftex下,使用cjk支持中文出现的错误,不是标准行为。

\the\dimexpr 1em\relax = 10.0pt

\the\dimexpr 1em\relax                     = 10.0pt
\ExplSyntaxOn
\dim_to_decimal:n { 1em }                  = 10
\dim_to_decimal_in_bp:n { 1em }            = 9.96265
\dim_to_decimal_in_sp:n { 1em }            = 655360
\dim_to_decimal_in_unit:nn { 1em } { 1mm } = 3.51462
\ExplSyntaxOff

使用 enumitem 宏包。

这种情况推荐使用 description 环境。

\documentclass{ctexart}
\usepackage{enumitem}
\usepackage{zhlipsum}

\begin{document}

\zhlipsum[9][name=zhufu]

%% 全局设置使用 \setlist[description]{...}
\begin{description}[nosep,labelindent=2em,leftmargin=6.5em,font=\normalfont]
\item[参数a:] 啦啦啦
\item[参数b:] 啦啦啦
\item[参数c:] 欸\zhlipsum[14][name=zhufu]
\end{description}


\noindent\hrulefill

\zhlipsum[9][name=zhufu]

\begin{itemize}[nosep,left=5em]
\item[参数a:] 啦啦啦
\item[参数b:] 啦啦啦
\item[参数c:] 欸\zhlipsum[14][name=zhufu]
\end{itemize}

\begin{itemize}[left=5em]
\item[参数a:] 啦啦啦
\item[参数b:] 啦啦啦
\item[参数c:] 欸\zhlipsum[14][name=zhufu]
\end{itemize}

\end{document}

image.png

实际上,页眉处的“第一章 研究进展”等文字是由 \<section>mark 来进行记录的,这里的 <section> 就是 chaptersectionsubsection 等。
使用 ctex 文档类或使用 ctexheading 宏包,或在 ctex 宏包中启用 heading=true 选项时,ctex 将自动地修改这些 \<section>mark 命令,类似于

\renewcommand{\sectionmark}[1]{\markright{\CTEXthesection #1}}
\renewcommand{\chaptermark}[1]{\markboth{\CTEXthechapter #1}{}}

这里的 \CTEXthesection\CTEXthechapter 就是在页眉处输出 “第一节”、“第一章” 的。
这里的变量 #1 就是 \<section> 中给出的标题,如“研究进展”。
因此只要重定义这些 mark,去掉诸如 \CTEXthesection 之类的命令,就可以实现你的需求了。ctex 宏包文档 6.3 节给出了两个例子。

这里再给一个例子:

\documentclass{ctexbook}
\usepackage{fancyhdr}
\usepackage{zhlipsum}

% \pagestyle{...} 放前面
\def\chaptermark#1{\markboth{#1}{}}
\def\sectionmark#1{\markright{#1}}

\begin{document}

\chapter{章一第}

\zhlipsum[1]

\section{节二第}

\zhlipsum[2-5]

\section{节三第}

\zhlipsum[6-10]

\end{document}

简单来说,当 label 不存在时,强行展开 \pageref 就会出现该错误。
第一次运行时,label 还没有写入 aux,这时,由于 \write 会自动展开它的参数,于是就出错了。

知道这之后,就容易解决了。

% \usepackage{expl3}% 在较新的 LaTeX2e 中是不必要的
\makeatletter
\ExplSyntaxOn
\cs_if_free:NT \use_ii:nnnnn
  { \cs_new:Npn \use_ii:nnnnn #1#2#3#4#5 { #2 } }
% 使用 hyperref,`\newlabel` 会写入 5 个参数,不使用 hyperref,则会写入 2 个参数,需要分别处理
% 第二个参数就是 page
\@ifpackageloaded{hyperref}
  {
    \cs_set_nopar:Npn \getrefpage #1
      { % 判断 label 是否存在,LaTeX 使用 "r@<label>" 保存 label
        \cs_if_exist:cTF { r@#1 } 
          { \exp_last_unbraced:Nv \use_ii:nnnnn { r@#1 } } % 获得5个中的第2个
          { 0 } % 若不存在则使用 0
      }  
  }
  {
    \cs_set_nopar:Npn \getrefpage #1
      { % 同上
        \cs_if_exist:cTF { r@#1 } 
          { \exp_last_unbraced:Nv \use_ii:nn { r@#1 } } 
          { 0 }
      }
  }
\ExplSyntaxOff
\makeatother

这样我们就可以使用 \getrefpage{<label>} 来获取 \label 定义的 label 的页码

\immediate\write\myoutfile{\getrefpage{nohere:a}}
\label{nohere:a} % label 需要在 \write 外部,才能创造一个label

由于 \label 是不可扩展的,若要在 \write 中写入,则需要使用 \noexpand\string

\immediate\write\myoutfile{\getrefpage{nohere:a}\noexpand\label{nohere:a}}
\label{nohere:a}

另外,\label 中的 page 实际上是 \thepage 而不是绝对页码,也不一定是数字,例如修改了 page 计数器,或者使用了 \pagenumbering

此时,要想获得绝对页面,可以使用 zref-abspage 宏包,相应的,可以定义一个 \getzrefabspage\getzrefpage 来获得绝对页码和相对页码。

% \usepackage{zref-abspage}
\makeatletter
\def\getzrefabspage#1{\zref@extract{#1}{abspage}}
\def\getzrefpage#1{\zref@ifrefundefined{#1}{0}{\zref@extract{#1}{page}}} % 同样需要检查是否存在
\makeatother
% \usepackage{zref-user,zref-abspage}
\zlabel{here:a}% 使用 \zlabel 而不是 \label
\immediate\write\myoutfile{\getzrefpage{here:a}\noexpand\zlabel{here:a}}
\immediate\write\myoutfile{\getzrefabspage{here:a}\noexpand\zlabel{here:a}}

当修改了 page 计数器,或者使用了 \pagenumbering 时,这二者是不同的。

一个完整的例子:

\documentclass{article}
% \usepackage{expl3}
\usepackage{zref-user,zref-abspage,lipsum}

\newwrite\myoutfile
\immediate\openout\myoutfile=\jobname-myoutfile.txt

\makeatletter
\def\getzrefabspage#1{\zref@extract{#1}{abspage}}
\def\getzrefpage#1{\zref@ifrefundefined{#1}{0}{\zref@extract{#1}{page}}}
\ExplSyntaxOn
\cs_if_free:NT \use_ii:nnnnn
  { \cs_new:Npn \use_ii:nnnnn #1#2#3#4#5 { #2 } }
\@ifpackageloaded{hyperref}
  {
    \cs_set_nopar:Npn \getrefpage #1
      {
        \cs_if_exist:cTF { r@#1 } 
          { \exp_last_unbraced:Nv \use_ii:nnnnn { r@#1 } } 
          { 0 }
      }  
  }
  {
    \cs_set_nopar:Npn \getrefpage #1
      {
        \cs_if_exist:cTF { r@#1 } 
          { \exp_last_unbraced:Nv \use_ii:nn { r@#1 } } 
          { 0 }
      }
  }
\ExplSyntaxOff
\makeatother

\begin{document}

\immediate\write\myoutfile{\getzrefpage{here:a}\noexpand\zlabel{here:a}}
\immediate\write\myoutfile{\getzrefabspage{here:a}\noexpand\zlabel{here:a}}
\zlabel{here:a}

\immediate\write\myoutfile{\getrefpage{nohere:a}\noexpand\label{nohere:a}}
\label{nohere:a}


\lipsum[1-10]


\pagenumbering{alph}


\zlabel{here:b}.
\immediate\write\myoutfile{\getzrefpage{here:b}\noexpand\zlabel{here:b}}
\immediate\write\myoutfile{\getzrefabspage{here:b}\noexpand\zlabel{here:b}}


\label{nohere:b}.
\immediate\write\myoutfile{\getrefpage{nohere:b}\noexpand\label{nohere:b}}

\lipsum[10-12]

\end{document}

在较新的 LaTeX2e 发行版中,原生提供了 \ReadonlyShipoutCountertotalpages 计数器来记录绝对页码。

发布
问题