根据使用的字体有条件地执行宏

时间:2010-07-05 15:17:33

标签: latex xetex

我是&符号的忠实粉丝 - 我非常虔诚地听取了SimpleBits对“use the best available ampersand”的建议。

为此,我在LaTeX中定义了以下快捷方式:

\let\amp\&
\renewcommand\&{{\scalebox{1.2}{\textnormal{\fontspec{Baskerville}\itshape\amp}}}}

简而言之,这会将“普通”&符号的所有用法改为时尚的变体,例如:

This is a text \& it contains an ampersand.

(使用\&而不仅仅是&,因为这是LaTeX的工作原理 - 后者已经保留用于分隔表环境中的列。)

然而,这总是使用相同的字体 - 在这里,Baskerville - 无论它是否适合。我想根据使用的字体系列使用不同的字体。也就是说,我想将另一个&符号与sans serif文本结合使用,特别是我希望阻止在monospace上下文中重写&符号。所以在以下两个上下文中,我不想触发上面的定义:

{\sffamily a \& b}
{\ttfamily a \& b}

我该怎么做?

我想象如下:

\renewcommand\&{
  \ifsans
    {\fontspec{Trebuchet MS}{\textnormal{\itshape\amp}}}
  \else
    \ifmono
      \amp
    \else
      {\fontspec{Baskerville}\scalebox{1.2}{\textnormal{\itshape\amp}}}
    \fi
  \fi}

2 个答案:

答案 0 :(得分:4)

它的工作方式如下:

\documentclass[letterpaper,10pt]{article}
\usepackage[latin1]{inputenc}
\usepackage{german}
\usepackage{geometry}
\geometry{margin=2cm}
\newcommand*\origsffamily{}
\let\origsffamily\sffamily
\renewcommand*\sffamily{\origsffamily\small {\renewcommand\&{{\scalebox{1.2}{\textnormal{\fontspec{Baskerville}\itshape\amp}}}}}}

\begin{document}


hello, this is \& a \sffamily test \& 


\end{document}

这意味着,您将&符号的更改包含在(在我的示例中)\sffamily的定义中。

缺点是 - 当然 - 您必须为所有想要的字体系列执行此操作。

答案 1 :(得分:2)

您可以测试标准LaTeX令牌列表\f@family,但是,这可能不如您所希望的那样可靠。以下代码只检查当前系列是否等于\setmainfont\setsansfont设置的默认系列,而不是字体是否真的是无衬线:

\documentclass{article}

\usepackage{fontspec}
\usepackage{expl3}
\usepackage{xparse}

\setmainfont{DejaVu Serif}
\setsansfont{DejaVu Sans}

\makeatletter
\ExplSyntaxOn
\NewDocumentCommand \amp { } {
  \tl_if_eq:NNTF \f@family \rmdefault {
    % this is a roman font
    A
  } {
    \tl_if_eq:NNTF \f@family \sfdefault {
      % this is a sans font
      B
    } {
      % something else
      C
    }
  }
}
\ExplSyntaxOff
\makeatother


\begin{document}

test \amp\ test

\sffamily
test \amp\ test

\ttfamily
test \amp\ test

\end{document}