Условно выполнить макрос в зависимости от используемого шрифта - PullRequest
5 голосов
/ 05 июля 2010

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

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

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

Короче говоря, это меняет все виды использования «нормального» амперсанда на стильный вариант, например ::10000

This is a text \& it contains an ampersand.

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

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

{\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 ]

4 голосов
/ 05 июля 2010

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

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

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

2 голосов
/ 05 июля 2010

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