有没有办法把所有的标点符号(逗号、句号、冒号、分号等)都变成罗马字母,即使当前的活动样式是斜体? 我正在使用mathtime
包和字体进行设置,标签如下:
\documentclass{book}
\usepackage[T1]{fontenc}
\usepackage[T1,mtbold]{mathtime}
\usepackage{times}
\begin{document}
\itshape Cool animals: Wombat, Capybara; Duck and Dove (no Pigeons).
\end{document}
答案1
(我在 ctt 上的回答的副本)
使用虚拟字体是可能的:您可以创建一个从罗马字体中获取标点符号的字体。使用 pdflatex 需要几个小时的工作(如果您还想微调字距,则需要更多时间)以及一些有关字体(特别是 fontinst)的知识。使用 lualatex 可以更快一些。
您还可以激活标点符号并定义它们以切换到 \upshape。但请注意,这很危险——您可能会破坏其他命令。例如,句号和点通常用于数字。
\documentclass{book}
\usepackage[english]{babel}
\usepackage[T1]{fontenc}
%\usepackage[T1,mtbold]{mathtime}
\usepackage{times}
\defineshorthand{.}{\textup{.}}
\defineshorthand{,}{\textup{,}}
\defineshorthand{;}{\textup{;}}
\useshorthands*{,}
\useshorthands*{.}
\useshorthands*{;}
\begin{document}
\itshape abc, abc; abc.
\shorthandoff{,}\shorthandoff{.}\shorthandoff{;}
abc, abc; abc.
\end{document}
答案2
您可以使用 LuaTeXpost_linebreak_filter
来实现这一点。
\documentclass{book}
\usepackage[T1]{fontenc}
\usepackage{times}
\usepackage{luacode}
\begin{luacode*}
function table.contains(t, k)
for _, v in pairs(t) do
if v == k then
return true
end
end
return false
end
function upright_punctucation(head)
-- Traverse vertical list
for line in node.traverse_id(node.id("hhead"),head) do
-- Traverse horizontal list
for glyph in node.traverse_id(node.id("glyph"), line.head) do
-- Check if the glyph is
-- ( ) , : ;
if (table.contains({ 40, 41, 44, 58, 59 }, glyph.char)) then
-- and change its font to upright.
-- (this is not so generic, 15 just happens to be upright)
glyph.font = 15
end
end
end
return head
end
luatexbase.add_to_callback("post_linebreak_filter",upright_punctucation,"upright_punctucation")
\end{luacode*}
\begin{document}
\itshape Cool animals: Wombat, Capybara; Duck and Dove (no Pigeons).
\end{document}