我想创建一个分段命令(例如小段落),该命令对于具有空标题的命令将有不同的行为。
这是我的 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
(带或不带星号,带或不带方括号内的可选参数)。
使用xparse
和etoolbox
(“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}
使用xparse
和expl3
(“expl3
风格”)
以下方法使用了expl3
LaTeX3 项目中的语言 的技术。它可以但并不依赖于的第五个参数\@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}
输出与上面相同。