Konvertieren von „Abschnitt“ in „\Abschnitt“ zur Übergabe an den Befehl „Titelformat“

Konvertieren von „Abschnitt“ in „\Abschnitt“ zur Übergabe an den Befehl „Titelformat“

Der \titleformatBefehl des titlesecPakets wird folgendermaßen aufgerufen:

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

Ich schreibe ein kleines Paket, um einige Formatierungen zu automatisieren, einschließlich der Formatierung von Abschnittstiteln, und dies titlesecist eines der Pakete, die ich „umpacke“. Das Problem ist, dass ich meinen Code gerne in der folgenden Form geschrieben hätte

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

Hier \sectionfamilyist mein benutzerdefinierter Befehl, der im Rahmen seiner Ausführung schließlich aufruft \titleformat. Nehmen wir der Frage zuliebe an, dass er wie folgt definiert ist:

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

Wie Sie sehen, versuche ich, \sectionfamily{section}{...}in zu konvertieren \titleformat{\section}{...}, aber die Art, wie ich es hier definiere, funktioniert nicht. Ich habe viele Kombinationen von usw. ausprobiert \expandafter, \csnameaber keine dieser Kombinationen hat funktioniert. Das Erstellen eines Alias-Befehls und die Übergabe des Alias ​​schlugen ebenfalls fehl.

Kennt jemand eine Möglichkeit, dies sectionumzuwandeln \sectionund zum Laufen zu bringen?


Hinweis: Der Befehl \titleformat{\section}{\itshape}{\thesection}{0pt}{}[]funktioniert und kann zum Ausprobieren verwendet werden. Das vollständige MWE (oder minimales, nicht funktionierendes Beispiel!!) ist

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

Antwort1

Es müssen zwei \expandafterAnweisungen vorhanden sein. Die erste zum Generieren der Befehlssequenz und dann zum \titleformatExpandieren im internen Setup (ich habe mir das Paket jedoch nicht angesehen).

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

Bildbeschreibung hier eingeben

Antwort2

Verwendung expl3(geladen von 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}

Du kannst anhand der angegebenen Beispiele weitere Schlüsselwörter hinzufügen. Ich glaube allerdings nicht, dass du mit dieser „Automatisierung“ viel gewinnst.

Bildbeschreibung hier eingeben

verwandte Informationen