.png)
Я хочу создать команду секционирования (например, подпункт), которая будет вести себя по-другому для команды с пустым заголовком.
Это мой 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
и etoolbox
. Кроме того, он использует тот факт, что \@startsection
пятый аргумент обязательно будет расширен, когда TeX использует его. Если вы хотите, чтобы пустой обязательный аргумент вашего \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}
Результат тот же, что и выше.