我正在用 babel 和 monotype 字体制作文档。我进行了一些设置以实现特定的对齐方式,但在使用其他语言时遇到了问题。
\documentclass[a4paper,13pt]{book}
\usepackage[french,english]{babel}
\usepackage{fontspec}
\setmainfont{DejaVu Sans Mono}
\spaceskip=1.0\fontdimen2\font plus 0\fontdimen3\font minus 0\fontdimen4\font
\begin{document}
\obeyspaces
\frenchspacing
\setlength{\parindent}{-2\fontcharwd\font`A}
\setlength{\leftskip}{2\fontcharwd\font`A}
\foreignlanguage{english}{%
\textbf{Lorem ipsum dolor sit amet}: consectetur adipiscing elit.
Cras sit amet est sit amet urna, tincidunt, consectetur
eget ut felis. Vestibulum, Nam dapibus.
}
\foreignlanguage{french}{%
\textbf{Lorem ipsum dolor sit amet}: consectetur adipiscing elit.
Cras sit amet est sit amet urna, tincidunt, consectetur
eget ut felis. Vestibulum, Nam dapibus.
}
\end{document}
当我切换到英语时,字符前缺少一个空格:
:
您知道如何:
在法语和英语中使 a 周围的间距相同吗?
答案1
出现这种情况的原因是英语不像法语那样在标点符号前加空格。
更新对 LuaLaTeX 的支持
尝试以同时支持lualatex
和 的方式执行此操作xelatex
。我一直使用,\raggedright
因为如果没有这个,您将得到满满的框。并且我以稍微好一点的方式将默认字体设置为等宽字体。
我仍然\extrasfrench
从 内部调用\extrasenglish
。但我还将lua
变量设置FR_ca
为与\the\l@english
( =0
) 相同。lua
执行标点符号间距的函数检查当前语言是 还是FR_fr
。FR_ca
通过将其中一个更改为0
(对于英语),我们可以获得两种语言的法语标点符号。最后,我添加了\frenchsetup{OriginalTypewriter=true}
以便如果您使用\ttfamily
或\texttt
它仍然有效。(默认情况下,french-babel
在这些情况下不会自动调整标点符号。)
另请注意,您已指定13pt
。 book 类仅支持10pt
、11pt
和12pt
。 因此,13pt
只需提供10pt
默认值即可。
xelatex
和的输出相同lualatex
。
\documentclass[a4paper,12pt]{book}
\usepackage[main=french,english]{babel}
\frenchsetup{OriginalTypewriter=true}
\addto\extrasenglish{%
\extrasfrench
}
\makeatletter
\ifx\directlua\@undefined\else
\directlua{FR_ca = \the\l@english}
\fi
\makeatother
\usepackage{fontspec}
\setmonofont{DejaVu Sans Mono}
\renewcommand{\familydefault}{\ttdefault}
\raggedright
\begin{document}
\section*{Français}
\today{}
\textbf{Lorem ipsum dolor sit amet}: consectetur adipiscing elit. Cras sit
amet est sit amet urna, tincidunt, consectetur eget ut felis. Vestibulum, Nam
dapibus.
\selectlanguage{english}
\section*{English with French punctuation}
\today{}
\textbf{Lorem ipsum dolor sit amet}: consectetur adipiscing elit. Cras sit
amet est sit amet urna, tincidunt, consectetur eget ut felis. Vestibulum, Nam
dapibus.
\end{document}
原始 XeLaTeX 唯一答案
就我一生而言,我无法弄清楚如何用 来改变这种行为lualatex
,但这似乎可以实现你想要的效果xelatex
。
我省略了所有的间距命令,因此您可以看到连字符规则(和字符串)仍然会发生变化,但标点符号规则仍然是法语。
基本上,我只是\extrasfrench
在 内部调用\extrasenglish
。据我所知,\extrasfrench
除了处理标点符号外,没有做太多其他事情。(但我可能是错的。)
13pt
顺便说一句,该课程没有什么可争论的book
。
我还设置了french
默认语言,因为如果您想在任何地方都使用法语风格的标点符号,这似乎很有意义。
\documentclass[a4paper,12pt]{book}
\usepackage[main=french,english]{babel}
\addto\extrasenglish{%
\extrasfrench
}
\usepackage{fontspec}
\setmainfont{DejaVu Sans Mono}
\begin{document}
\section*{Français}
\today{}
\textbf{Lorem ipsum dolor sit amet}: consectetur adipiscing elit. Cras sit
amet est sit amet urna, tincidunt, consectetur eget ut felis. Vestibulum, Nam
dapibus.
\selectlanguage{english}
\section*{English}
\today{}
\textbf{Lorem ipsum dolor sit amet}: consectetur adipiscing elit. Cras sit
amet est sit amet urna, tincidunt, consectetur eget ut felis. Vestibulum, Nam
dapibus.
\end{document}
答案2
取消法语中高标点符号周围的额外空格(因此,如果您需要它,您必须自己在源中输入它)。
\documentclass[a4paper]{book}
\usepackage[french,english]{babel}
\frenchsetup{AutoSpacePunctuation=false}
\usepackage{fontspec}
\setmainfont{DejaVu Sans Mono}
\spaceskip=\fontdimen2\font\relax
\begin{document}
\obeyspaces
\frenchspacing
\setlength{\parindent}{-2\fontcharwd\font`A}
\setlength{\leftskip}{2\fontcharwd\font`A}
\foreignlanguage{english}{%
\textbf{Lorem ipsum dolor sit amet}: consectetur adipiscing elit.
Cras sit amet est sit amet urna, tincidunt, consectetur
eget ut felis. Vestibulum, Nam dapibus.
}
\foreignlanguage{french}{%
\textbf{Lorem ipsum dolor sit amet}: consectetur adipiscing elit.
Cras sit amet est sit amet urna, tincidunt, consectetur
eget ut felis. Vestibulum, Nam dapibus.
}
\end{document}
顺便说一下,修补babel-french
程序在使用等宽字体时不会插入额外的间距,但在这个例子中,没有使用这些 LaTeX 宏。\texttt
\ttfamily