如何确定当前字体样式

如何确定当前字体样式

在电影研究中,用小写字母打印电影标题是很常见的。在我的文档中,我使用命令\film{}来执行此操作。我目前有一个混合了衬线字体和无衬线字体的文档。但由于无衬线字体没有小写字母,我不得不依靠假小写字母(使用此解决方案)。

我想要实现的是,根据所用的字体\film{}自动使用\textsc{}或伪小写字母。换句话说,我需要一种方法来确定当前字体是否为无衬线字体。

答案1

您必须比较\f@family和的当前值\sfdefault:如果它们匹配,则您以无衬线字体进行排版。

基本上你

\ifnum\pdf@strcmp{\f@family}{\sfdefault}=\z@
   <we are using sans serif>
\else
   <we are not using sans serif>
\fi

例子:

\usepackage{pdftexcmds}
\makeatletter
\DeclareRobustCommand{\film}[1]{%
  \ifnum\pdf@strcmp{\f@family}{\sfdefault}=\z@
    \fakesc{#1}%
  \else
    \textsc{#1}%
  \fi
}
\makeatother

只是为了好玩,这里有一个使用以下实现l3regex

\documentclass{article}

\usepackage{fontspec}
\usepackage{xparse}

\setmainfont{Linux Libertine O} % has small caps
\setsansfont{Alegreya Sans} % has no small caps

\ExplSyntaxOn
\NewDocumentCommand{\film}{ m }
 {
  \simifilm_film:n { #1 }
 }

\tl_new:N \l__simifilm_fakesc_tl

\cs_new_protected:Npn \simifilm_film:n #1
 {
  \str_if_eq_x:nnTF { \use:c { f@family } } { \sfdefault }
   {
    \simifilm_fakesc:n { #1 }
   }
   {
    \textsc{ #1 }
   }
 }

\cs_new_protected:Npn \simifilm_fakesc:n #1
 {
  \use:c { protected@edef } \l__simifilm_fakesc_tl { #1 }
  \regex_replace_all:NnN
   \c_simifilm_lowercase_regex % search any run of lowercase letters 
   { \c{simifilm_reduce:n}\cB\{\1\cE\} } % replace it with \simifilm_reduce:n{<run>}
   \l__simifilm_fakesc_tl
  \tl_use:N \l__simifilm_fakesc_tl
 }

\cs_new_protected:Npn \simifilm_reduce:n #1
 {
  { \fontsize{ \fp_eval:n { .8 * \use:c { f@size } } }{0}\selectfont \text_uppercase:n {#1} }
 }

% update the constant for accommodating the accented characters you need
\regex_const:Nn \c_simifilm_lowercase_regex { ( [ a-z é ]+ ) }

\ExplSyntaxOff

\begin{document}

\film{Stagecoach} is a great movie

\sffamily

\film{La Chevauchée fantastique} is the French title

\end{document}

支持重音字符,但您需要在搜索正则表达式中添加所需的字符。

在此处输入图片描述

相关内容