Convertendo "section" em "\section" para passar para o comando titleformat

Convertendo "section" em "\section" para passar para o comando titleformat

O \titleformatcomando do titlesecpacote é invocado da seguinte maneira:

\titleformat{\section}{<a few formatting options>}
\titleformat{\subsection}{<a few formatting options>}

Estou escrevendo um pequeno pacote para automatizar algumas formatações, incluindo a formatação de títulos de seções, e titlesecé um dos pacotes que estou "embrulhando". O problema é que gostaria que meu código fosse escrito da seguinte forma

\sectionfamily{section}{uppercase}
\sectionfamily{subsection}{italic}

Aqui \sectionfamilyestá meu comando personalizado que, como parte de sua execução, eventualmente chamará \titleformat. Suponha, para fins de questão, que seja definido como:

\newcommand{\sectionfamily}[2]{   
    \titleformat{\#1}{\itshape}{\thesection}{0pt}{}[]
}

Como você pode ver, estou tentando converter \sectionfamily{section}{...}para \titleformat{\section}{...}, mas a forma como defino aqui não funciona. Eu tentei muitas combinações de \expandaftere \csnameassim por diante, mas também não consegui fazer nenhuma dessas combinações funcionar. Criar um comando de alias e passar o alias também falhou.

Alguém sabe uma maneira de sectionconverter \sectione fazer funcionar?


Nota: o comando \titleformat{\section}{\itshape}{\thesection}{0pt}{}[]funciona e pode ser usado para testar coisas. O MWE completo (ou exemplo mínimo que não funciona!!) é

\documentclass[11pt,oneside,a4paper]{article}
\usepackage{titlesec} 

\begin{document}

\section{How does this look?}

\newcommand{\sectionfamily}[2]{   
   \titleformat{\#1}{\itshape}{\thesection}{0pt}{}[]
}
\sectionfamily{section}{italic}
%What I want to run:
%\titleformat{\section}{\itshape}{\thesection}{0pt}{}[]
\section{How does this look?}
\end{document}

Responder1

Deve haver duas \expandafterdeclarações. O primeiro para gerar a sequência de comandos e depois para \titleformatexpandir na configuração interna (no entanto, não olhei o pacote)

\documentclass[11pt,oneside,a4paper]{article}
\usepackage{titlesec} 


\newcommand{\sectionfamily}[2]{%   
  \expandafter\titleformat\expandafter{\csname #1\endcsname}{\itshape}{\csname the#1\endcsname~}{0pt}{}[]
}


\sectionfamily{section}{italic}


\sectionfamily{subsection}{italic}


\begin{document}

\section{How does this look?}

%\newcommand{\sectionfamily}[2]{   
%   \titleformat{\#1}{\itshape}{\thesection}{0pt}{}[]
%}

%What I want to run:
%\titleformat{\section}{\itshape}{\thesection~}{0pt}{}[]
\section{How does this look?}

\subsection{Happy?}
\end{document}

insira a descrição da imagem aqui

Responder2

Usar expl3(carregado por xparse):

\documentclass[11pt,oneside,a4paper]{article}
\usepackage{titlesec}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\sectionfamily}{mm}
 {
  \fennell_section_family:nn { #1 } { #2 }
 }

\cs_new_protected:Npn \fennell_section_family:nn #1 #2
 {
  \tl_clear:N \l_fennell_section_font_tl
  \tl_clear:N \l_fennell_section_format_tl
  \str_case:nn { #2 }
   {
    { italic } { \tl_set:Nn \l_fennell_section_font_tl { \itshape } }
    { uppercase } { \tl_set:Nn \l_fennell_section_format_tl { \MakeUppercase } }
   }
  \use:x
   {
    \exp_not:N \titleformat
     { \exp_not:c { #1 } }
     { \exp_not:V \l_fennell_section_font_tl }
     { \exp_not:c { the#1 } }
     { 1em }
     { \exp_not:V \l_fennell_section_format_tl }
   }
 }
\ExplSyntaxOff

\sectionfamily{section}{uppercase}
\sectionfamily{subsection}{italic}

\begin{document}

\section{How does this look?}

\subsection{How does this look?}

\end{document}

Você pode adicionar outras palavras-chave com base nos exemplos dados. Porém, não acho que você ganhe muito com essa “automação”.

insira a descrição da imagem aqui

informação relacionada