使用xparse和etoolbox(“LaTeX2e 样式”)

使用xparse和etoolbox(“LaTeX2e 样式”)

我想创建一个分段命令(例如小段落),该命令对于具有空标题的命令将有不同的行为。

这是我的 MWE,显示了我想要获得的内容:

\documentclass{article}
\setcounter{secnumdepth}{7} 

\makeatletter    
\renewcommand\subparagraph{\@startsection{subparagraph}{5}{\parindent}%
    {3.25ex \@plus1ex \@minus .2ex}%
    {1.5ex \@plus .2ex}%
    {\normalfont\normalsize\bfseries}}
\makeatother

\begin{document}

\subparagraph{Subparagraph with title}

Some random text

\makeatletter
\renewcommand\subparagraph{\@startsection{subparagraph}{5}{\parindent}%
    {3.25ex \@plus1ex \@minus .2ex}%
    {-1em}%
    {\normalfont\normalsize\bfseries}}
\makeatother

\subparagraph{} Some random text for subparagraph without title

\end{document}

我看了一下这个问题的答案:\section 标题为空。在第一段旁边显示数字

它做的事情和我想要的一样,但是没有 我能得到相同的结果titlesec吗?

答案1

据我所知,\subparagraph{}这不是使用 LaTeX\subparagraph命令的正常方式,因此最好给您的命令起一个不同的名字。\subparagraph无论如何,我都会用名字来回答,因为这是问题中问到的。我提出了两种方法,都使用xparse以便轻松抓取和分析所有可能的参数\subparagraph(带或不带星号,带或不带方括号内的可选参数)。

使用xparseetoolbox(“LaTeX2e 样式”)

此方法使用xparse和。此外,它还利用了TeX 使用 的第五个参数时必然会扩展的etoolbox事实。如果您希望 的空白强制参数以与空参数相同的方式处理,只需将其替换为;然后,和就会具有相同的行为。\@startsection\subparagraph\ifstrempty\ifblank\subparagraph{ }\subparagraph{}

\documentclass{article}
\usepackage{xparse}
\usepackage{etoolbox}
\usepackage{lipsum}

\setcounter{secnumdepth}{7}

\makeatletter

\newcommand*{\alecheim@subparagraph}[1]{%
  \@startsection{subparagraph}{5}{\parindent}%
    {3.25ex \@plus1ex \@minus .2ex}%
    % The following argument will be expanded during <glue> assignments
    {\ifstrempty{#1}{-1em}{1.5ex \@plus .2ex}}
    {\normalfont\normalsize\bfseries}%
}

\RenewDocumentCommand{\subparagraph}{sO{#3}m}{%
  \IfBooleanTF{#1}
    {\alecheim@subparagraph{#3}*{#3}}
    {\alecheim@subparagraph{#3}[#2]{#3}}%
}

\makeatother

\begin{document}

\subparagraph{Subparagraph with title}

\lipsum[1][1-2]

\subparagraph{} Some random text for subparagraph without title.

\end{document}

截屏

使用xparseexpl3(“expl3风格”)

以下方法使用了expl3LaTeX3 项目中的语言 的技术。它可以但并不依赖于的第五个参数\@startsection会在某个时候自动扩展;相反,我们在以下行中自己进行所需的扩展,并将结果存储在中\l_tmpa_tl

\tl_set:Nx \l_tmpa_tl { \tl_if_empty:nTF {#3} { -1em } { 1.5ex \@plus .2ex } }

然后我们使用V参数类型来\alecheim_subparagraph:V \l_tmpa_tl传递\alecheim_subparagraph:n参数价值\l_tmpa_tl。以下是完整示例:

\documentclass{article}
\usepackage{xparse}
\usepackage{lipsum}

\setcounter{secnumdepth}{7}

\makeatletter
\ExplSyntaxOn

\cs_new_protected:Npn \alecheim_subparagraph:n #1
  {
    \@startsection { subparagraph } { 5 } { \parindent }
      { 3.25ex \@plus 1ex \@minus .2ex }
      {#1}
      { \normalfont \normalsize \bfseries }
  }

\cs_generate_variant:Nn \alecheim_subparagraph:n { V }

\RenewDocumentCommand { \subparagraph } { s O{#3} m }
  {
    % You may want to replace \tl_if_empty:nTF with \tl_if_blank:nTF here.
    \tl_set:Nx \l_tmpa_tl
      { \tl_if_empty:nTF {#3} { -1em } { 1.5ex \@plus .2ex } }
    \IfBooleanTF {#1}
      { \alecheim_subparagraph:V \l_tmpa_tl * {#3} }
      { \alecheim_subparagraph:V \l_tmpa_tl [#2]{#3} }
  }

\ExplSyntaxOff
\makeatother

\begin{document}

\subparagraph{Subparagraph with title}

\lipsum[1][1-2]

\subparagraph{} Some random text for subparagraph without title.

\end{document}

输出与上面相同。

相关内容