Преобразование «section» в «\section» для передачи команде titleformat

Преобразование «section» в «\section» для передачи команде titleformat

Команда \titleformatпакета titlesecвызывается следующим образом:

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

Я пишу небольшой пакет для автоматизации форматирования, включая форматирование заголовков разделов, и titlesecэто один из пакетов, который я "оборачиваю". Проблема в том, что я хочу, чтобы мой код был написан в следующей форме

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

Вот \sectionfamilyмоя пользовательская команда, которая в ходе своего выполнения в конечном итоге вызовет \titleformat. Предположим, ради вопроса, что она определена так:

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

Как видите, я пытаюсь преобразовать \sectionfamily{section}{...}в \titleformat{\section}{...}, но то, как я это здесь определяю, не работает. Я пробовал много комбинаций \expandafter, \csnameи так далее, но не смог заставить работать ни одну из этих комбинаций. Создание команды псевдонима и передача псевдонима также не удались.

Кто-нибудь знает, как это sectionможно преобразовать \sectionи заставить работать?


Примечание: команда \titleformat{\section}{\itshape}{\thesection}{0pt}{}[]работает и может использоваться для проверки. Полный MWE (или минимальный нерабочий пример!!)

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

решение1

Должно быть два \expandafterоператора. Первый для генерации последовательности команд, а затем для \titleformatрасширения во внутренней настройке (я не смотрел в пакет, однако)

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

введите описание изображения здесь

решение2

Использовать expl3(загружено 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}

Вы можете добавить другие ключевые слова, основываясь на приведенных примерах. Я не думаю, что вы много выиграете от этой «автоматизации».

введите описание изображения здесь

Связанный контент