Использование 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(со звездочкой или без нее, с необязательным аргументом в квадратных скобках или без него).

Использование 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и expl3expl3стиль»)

Следующий метод использует приемы из 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}

Результат тот же, что и выше.

Связанный контент