Я - большой поклонник амперсандов – так, что я учитываю совет 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}
Это работает следующим образом:
\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
, но не проверяет, действительно ли шрифты являются 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}