Usando xparsey etoolbox(“estilo LaTeX2e”)

Usando xparsey etoolbox(“estilo LaTeX2e”)

Quiero crear un comando de sección (por ejemplo, subpárrafo) que tendrá un comportamiento diferente al comando con título vacío.

Este es mi MWE, mostrando algo de lo que quiero obtener:

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

Miré la respuesta a esta pregunta:\sección con título vacío. Mostrar número junto al primer párrafo

Hace lo mismo que quiero, pero ¿puedo obtener el mismo resultado sin titlesec?

Respuesta1

Hasta donde yo sé, \subparagraph{}no es la forma normal de usar el comando de LaTeX \subparagraph, por lo que puede ser una buena idea darle un nombre diferente al comando. Voy a responder con el \subparagraphnombre de todos modos, ya que es lo que se preguntó en la pregunta. Propongo dos métodos, ambos utilizados xparsepara capturar y analizar fácilmente todos los argumentos posibles de \subparagraph(con o sin asterisco, con o sin el argumento opcional entre corchetes).

Usando xparsey etoolbox(“estilo LaTeX2e”)

Este método utiliza xparsey etoolbox. Además, explota el hecho de que \@startsectionel quinto argumento de necesariamente se ampliará cuando TeX lo utilice. Si desea que un argumento obligatorio en blanco se \subparagraphmaneje de la misma manera que uno vacío, simplemente reemplácelo \ifstremptycon \ifblank; entonces, \subparagraph{ }y \subparagraph{}tendrá el mismo comportamiento.

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

captura de pantalla

Usando xparsey expl3(“ expl3estilo”)

El siguiente método utiliza técnicas de expl3, el lenguaje del proyecto LaTeX3. Élpodríapero no se basa en el hecho de que el quinto argumento de \@startsectionse ampliará automáticamente en algún momento; en su lugar, hacemos nosotros mismos la expansión requerida en la siguiente línea, que almacena el resultado en \l_tmpa_tl:

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

Luego usamos un Vtipo de argumento con \alecheim_subparagraph:V \l_tmpa_tlpara pasar \alecheim_subparagraph:nelvalorde \l_tmpa_tl. Aquí está el ejemplo completo:

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

El resultado es el mismo que el anterior.

información relacionada