
Команда \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}
Вы можете добавить другие ключевые слова, основываясь на приведенных примерах. Я не думаю, что вы много выиграете от этой «автоматизации».