Usando xparsee etoolbox(“estilo LaTeX2e”)

Usando xparsee etoolbox(“estilo LaTeX2e”)

Quero fazer um comando de seccionamento (por exemplo, subparágrafo) que terá um comportamento diferente para comando com título vazio.

Este é o meu MWE, mostrando um pouco sobre o que desejo obter:

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

Eu olhei para a resposta para esta pergunta:\section com título vazio. Mostrar número próximo ao primeiro parágrafo

Ele faz a mesma coisa que eu quero, mas posso obter o mesmo resultado sem titlesec?

Responder1

Pelo que eu sei, \subparagraph{}não é a maneira normal de usar o comando do LaTeX \subparagraph, então pode ser uma boa ideia dar um nome diferente ao seu comando. Vou responder com o \subparagraphnome mesmo assim, pois é o que foi perguntado na pergunta. Proponho dois métodos, ambos usados xparse​​para capturar e analisar facilmente todos os argumentos possíveis de \subparagraph(com ou sem asterisco, com ou sem o argumento opcional entre colchetes).

Usando xparsee etoolbox(“estilo LaTeX2e”)

Este método usa xparsee etoolbox. Além disso, ele explora o fato de que o \@startsectionquinto argumento do será necessariamente expandido quando o TeX o utilizar. Se você deseja que um argumento obrigatório em branco \subparagraphseja tratado da mesma maneira que um argumento vazio, basta substituir \ifstremptypor \ifblank; então, \subparagraph{ }e \subparagraph{}terá o mesmo comportamento.

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

Usando xparsee expl3(“ expl3estilo”)

O método a seguir usa técnicas deexpl3 , a linguagem do projeto LaTeX3. Istopoderiamas não confia no fato de que o quinto argumento \@startsectionserá automaticamente expandido em algum ponto; em vez disso, nós mesmos fazemos a expansão necessária na linha a seguir, que armazena o resultado em \l_tmpa_tl:

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

Então usamos um Vtipo de argumento with \alecheim_subparagraph:V \l_tmpa_tlpara passar\alecheim_subparagraph:n ovalorde \l_tmpa_tl. Aqui está o exemplo 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}

A saída é a mesma acima.

informação relacionada