Условно выполнить макрос в зависимости от используемого шрифта

Я большой поклонник амперсандов - настолько, что прислушался к совету SimpleBits "использовать самый лучший из доступных амперсандов" довольно религиозно.

Для этого я определил следующий ярлык в LaTeX:

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

Вкратце, это меняет все виды использования "нормального" амперсанда на стильный вариант, например:

This is a text \& it contains an ampersand.

(С помощью \& вместо просто & поскольку так работает LaTeX - последний уже зарезервирован для отдельных столбцов в табличных средах.)

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

{\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 ответа

Решение

Работает следующим образом:

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

Недостатком является, конечно, то, что вы должны делать это для всех желаемых семейств шрифтов.

Вы можете проверить стандартный список токенов 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}
Другие вопросы по тегам