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

Я - большой поклонник амперсандов – так, что я учитываю совет SimpleBits “использовать наилучший имеющийся амперсанд” вполне неукоснительно.

С этой целью я определил следующий ярлык в ЛАТЕКСЕ:

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

Короче говоря, это изменяет все использование “нормального” амперсанда к стильному варианту, например:

This is a text \& it contains an ampersand.

(Используя \& вместо просто & так как это - то, как ЛАТЕКС работает – последний уже резервируется для разделения столбцов в средах таблицы.)

Однако это всегда использует тот же шрифт – здесь, 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}

5
задан Konrad Rudolph 5 July 2010 в 15:25
поделиться

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 .

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

4
ответ дан 14 December 2019 в 13:25
поделиться

Вы можете проверить стандартный список маркеров LaTeX \f@family, однако, это может быть не так надежно, как вы хотите. Следующий код просто проверяет, равно ли текущее семейство семействам по умолчанию, установленным \setmainfont и \setsansfont, но не проверяет, действительно ли шрифты являются sans-serif:

\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}
2
ответ дан 14 December 2019 в 13:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: