Verwenden von xparseund etoolbox(„LaTeX2e-Stil“)

Verwenden von xparseund etoolbox(„LaTeX2e-Stil“)

Ich möchte einen Abschnittsbefehl (z. B. Unterabsatz) erstellen, der sich bei Befehlen mit leerem Titel anders verhält.

Dies ist mein MWE, das ungefähr zeigt, was ich erreichen möchte:

\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}

Ich habe mir die Antwort auf diese Frage angesehen:\Abschnitt mit leerem Titel. Nummer neben dem ersten Absatz anzeigen

Es macht dasselbe, was ich möchte, aber kann ich ohne dasselbe Ergebnis erzielen titlesec?

Antwort1

Soweit ich weiß, \subparagraph{}ist dies nicht die normale Art, den LaTeX- \subparagraphBefehl zu verwenden. Daher ist es möglicherweise eine gute Idee, Ihrem Befehl einen anderen Namen zu geben. Ich werde \subparagraphtrotzdem mit dem Namen antworten, da dies in der Frage gefragt wurde. Ich schlage zwei Methoden vor, die beide verwenden, xparseum alle möglichen Argumente \subparagraph(mit oder ohne Stern, mit oder ohne das optionale Argument in eckigen Klammern) einfach zu erfassen und zu analysieren.

Verwenden von xparseund etoolbox(„LaTeX2e-Stil“)

Diese Methode verwendet xparseund etoolbox. Darüber hinaus nutzt sie die Tatsache, dass \@startsectiondas fünfte Argument von zwangsläufig erweitert wird, wenn TeX es verwendet. Wenn Sie möchten, dass ein leeres obligatorisches Argument Ihrer \subparagraphgenauso behandelt wird wie ein leeres, ersetzen Sie es einfach \ifstremptydurch \ifblank; dann haben \subparagraph{ }und dasselbe Verhalten.\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}

Bildschirmfoto

Verwenden von xparseund expl3(„ expl3Stil“)

Die folgende Methode verwendet Techniken aus expl3, der Sprache aus dem LaTeX3-Projekt. Siekönnteverlässt sich aber nicht darauf, dass das fünfte Argument von \@startsectionirgendwann automatisch erweitert wird; stattdessen nehmen wir die erforderliche Erweiterung selbst in der folgenden Zeile vor, die das Ergebnis in speichert \l_tmpa_tl:

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

Dann verwenden wir einen VArgumenttyp mit, \alecheim_subparagraph:V \l_tmpa_tlum \alecheim_subparagraph:ndieWertvon \l_tmpa_tl. Hier ist das vollständige Beispiel:

\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}

Die Ausgabe ist die gleiche wie oben.

verwandte Informationen