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

我是&符号的忠实粉丝 - 我非常虔诚地听取SimpleBits的建议“使用最好的&符号”。 为此,我在LaTeX中定义了以下快捷方式:
letamp&
renewcommand&{{scalebox{1.2}{textnormal{fontspec{Baskerville}itshapeamp}}}}
简而言之,这将“普通”&符号的所有用法改为时尚的变体,例如:
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{itshapeamp}}}
  else
    ifmono
      amp
    else
      {fontspec{Baskerville}scalebox{1.2}{textnormal{itshapeamp}}}
    fi
  fi}
    
已邀请:
它的工作方式如下:
documentclass[letterpaper,10pt]{article}
usepackage[latin1]{inputenc}
usepackage{german}
usepackage{geometry}
geometry{margin=2cm}
newcommand*origsffamily{}
letorigsffamilysffamily
renewcommand*sffamily{origsffamilysmall {renewcommand&{{scalebox{1.2}{textnormal{fontspec{Baskerville}itshapeamp}}}}}}

begin{document}


hello, this is & a sffamily test & 


end{document}
这意味着,您将&符号的更改包含在(在我的示例中)definition7ѭ的定义中。 缺点是 - 当然 - 您必须为所有想要的字体系列执行此操作。     
您可以测试标准的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}
    

要回复问题请先登录注册