\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}
您可以根据给出的示例添加其他关键字。不过,我认为这种“自动化”不会给您带来太多好处。