![XeLaTeX 中孟加拉语的单引号无法正常工作](https://linux22.com/image/431438/XeLaTeX%20%E4%B8%AD%E5%AD%9F%E5%8A%A0%E6%8B%89%E8%AF%AD%E7%9A%84%E5%8D%95%E5%BC%95%E5%8F%B7%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E5%B7%A5%E4%BD%9C.png)
请参阅下面的 MWE:
\documentclass[12pt,a4paper]{article}
% For a bilingual document
\RequirePackage{fontspec}
\RequirePackage{polyglossia}
\setmainlanguage{english}
\defaultfontfeatures{Ligatures=TeX}
% Times New Roman used for English
\setmainfont[Mapping=tex-text, Ligatures=TeX]{Times New Roman}
\setmainlanguage[numerals=Devanagari]{bengali}
\setotherlanguage{english}
% Bengali
\newfontfamily\bengalifont[Script=Bengali,AutoFakeBold=4.0,AutoFakeSlant=0.4]{SolaimanLipi}
\newfontfamily\bengalifontbf[Script=Bengali,AutoFakeBold=4.0,AutoFakeSlant=0.4]{SolaimanLipi}
\newfontfamily\bengalifontsf[Script=Bengali,AutoFakeBold=4.0,AutoFakeSlant=0.4]{SolaimanLipi}
\title{LaTeX ইংলিশ ডকুমেন্টে বাংলা বোল্ড এবং ইটালিক ফন্ট লেখাটি কীভাবে লিখবেন?}
\author{MKS}
\begin{document}
\maketitle
`সাধারন স্টাইল', \textbf{বোল্ড ফন্ট স্টাইল }, \textit{ইটালিক ফন্ট স্টাইল । }
\end{document}
单引号在孟加拉语中不起作用。如何才能正常工作?
答案1
这里有几个问题:polyglossia
正在`
激活,我怀疑您选择的字体(您没有说明您使用的是几种名称相似的字体中的哪一种)根本不包含智能引号。我能找到的最有可能的匹配不包含智能引号。
输入 Unicode 字符‘
和’
,并选择具有这些字符的字体,即可使该部分工作。但是,许多孟加拉语字体缺少您要求的梵文数字。
\documentclass[12pt,a4paper]{article}
\tracinglostchars=2
% For a bilingual document
\RequirePackage{polyglossia}
\defaultfontfeatures{ Ligatures=TeX, Scale=MatchUppercase }
% Times New Roman used for English
\setmainfont{Times New Roman}
\setmainlanguage{bengali}
\setotherlanguage{english}
% Bengali
\newfontfamily\bengalifont{NotoSerifBengali}[
Script=Bengali,
Language=Bengali,
AutoFakeBold = 0.2,
AutoFakeSlant = 0.15 ]
\title{\textenglish{LaTeX} ইংলিশ ডকুমেন্টে বাংলা বোল্ড এবং ইটালিক ফন্ট লেখাটি কীভাবে লিখবেন?}
\author{\textenglish{MKS}}
\begin{document}
\maketitle
‘সাধারন স্টাইল’, \textbf{বোল্ড ফন্ট স্টাইল}, \textit{ইটালিক ফন্ট স্টাইল । }
\end{document}
如果您确实想使用这种特定的字体,在 XeLaTeX 中,理论上您可以ucharclasses
从一种字体中获取孟加拉语,从另一种字体中获取拉丁语和标点符号,从第三种字体中获取天城文。
答案2
ucharclasses
对于 xelatex 或 lualatex,使用 expl3 正则表达式和替换函数作为执行@Davislor 评论中提到的功能的一种手动方式。
这些颜色只是为了测试,以显示字形来自不同的字体。
平均能量损失
\documentclass[12pt,a4paper]{article}
\usepackage{xcolor}
% For a bilingual document
\usepackage{fontspec}
\usepackage{polyglossia}
\setmainlanguage{english}
\defaultfontfeatures{Ligatures=TeX}
% Times New Roman used for English
\setmainfont[Mapping=tex-text, Ligatures=TeX]{Times New Roman}
\setmainlanguage[numerals=Bengali,
changecounternumbering=true]{bengali}
\setotherlanguage{english}
%Punctuation (quotes) source:
\newfontfamily\ftpunct{Times New Roman}[Colour=red]%for testing
%Digits
\newfontfamily\ftdigits{Noto Sans Devanagari}[Colour=blue]%for testing
% Bengali
\newfontfamily\bengalifont[Script=Bengali,AutoFakeBold=4.0,AutoFakeSlant=0.4]{Kalpurush}%SolaimanLipi}
\newfontfamily\bengalifontbf[Script=Bengali,AutoFakeBold=4.0,AutoFakeSlant=0.4]{Kalpurush}%SolaimanLipi}
\newfontfamily\bengalifontsf[Script=Bengali,AutoFakeBold=4.0,AutoFakeSlant=0.4]{Kalpurush}%SolaimanLipi}SolaimanLipi}
\title{LaTeX ইংলিশ ডকুমেন্টে বাংলা বোল্ড এবং ইটালিক ফন্ট লেখাটি কীভাবে লিখবেন?}
\author{MKS}
%========================
\ExplSyntaxOn
\tl_new:N \l_myxuchar_tl
\tl_new:N \l_myxucharb_tl
\NewDocumentEnvironment{xuchare}{ +b }
{
\tl_set:Nn \l_myxuchar_tl { #1 }
\doxuchar
\tl_use:N \l_myxuchar_tl
}{}
\NewDocumentCommand{\xuchar}{ m }
{
\tl_set:Nn \l_myxucharb_tl { #1 }
\doxucharb
\tl_use:N \l_myxucharb_tl
}{}
\newcommand\doxuchar{
\regex_replace_all:nnN %opening quote
{
([\`]+)
([ঀ-]{1}) % Bengali glyphs: 0980 to 09FF
}
{
\cB\{
\c{formatquotes}
\1
\cE\}
\2
}
\l_myxuchar_tl
\regex_replace_all:nnN %closing quote
{
([ঀ-]{1}) % Bengali glyphs: 0980 to 09FF
([\']+)
}
{
\1
\cB\{
\c{formatquotes}
\2
\cE\}
}
\l_myxuchar_tl
%Bengali digits to Devanagari
\tl_replace_all:Nnn \l_myxuchar_tl { ০ } { {\formatdigits ०} }
\tl_replace_all:Nnn \l_myxuchar_tl { ১ } { {\formatdigits १} }
\tl_replace_all:Nnn \l_myxuchar_tl { ২ } { {\formatdigits २} }
\tl_replace_all:Nnn \l_myxuchar_tl { ৩ } { {\formatdigits ३} }
\tl_replace_all:Nnn \l_myxuchar_tl { ৪ } { {\formatdigits ४} }
\tl_replace_all:Nnn \l_myxuchar_tl { ৫ } { {\formatdigits ५} }
\tl_replace_all:Nnn \l_myxuchar_tl { ৬ } { {\formatdigits ६} }
\tl_replace_all:Nnn \l_myxuchar_tl { ৭ } { {\formatdigits ७} }
\tl_replace_all:Nnn \l_myxuchar_tl { ৮ } { {\formatdigits ८} }
\tl_replace_all:Nnn \l_myxuchar_tl { ৯ } { {\formatdigits ९} }
}
\newcommand\doxucharb{
%Bengali digits to Devanagari
\tl_replace_all:Nnn \l_myxucharb_tl { ০ } { {\formatdigits ०} }
\tl_replace_all:Nnn \l_myxucharb_tl { ১ } { {\formatdigits १} }
\tl_replace_all:Nnn \l_myxucharb_tl { ২ } { {\formatdigits २} }
\tl_replace_all:Nnn \l_myxucharb_tl { ৩ } { {\formatdigits ३} }
\tl_replace_all:Nnn \l_myxucharb_tl { ৪ } { {\formatdigits ४} }
\tl_replace_all:Nnn \l_myxucharb_tl { ৫ } { {\formatdigits ५} }
\tl_replace_all:Nnn \l_myxucharb_tl { ৬ } { {\formatdigits ६} }
\tl_replace_all:Nnn \l_myxucharb_tl { ৭ } { {\formatdigits ७} }
\tl_replace_all:Nnn \l_myxucharb_tl { ৮ } { {\formatdigits ८} }
\tl_replace_all:Nnn \l_myxucharb_tl { ৯ } { {\formatdigits ९} }
}
\date{\exp_args:Ne \xuchar { \today } }
\ExplSyntaxOff
\newcommand\formatquotes{\ftpunct}%switch
\newcommand\formatdigits{\ftdigits}%switch
\AtBeginEnvironment{document}{\begin{xuchare}}
\AfterEndEnvironment{document}{\end{xuchare}}
\begin{document}
\maketitle
`সাধারন স্টাইল', ``সাধারন স্টাইল'', \textbf{বোল্ড ফন্ট স্টাইল }, \textit{ইটালিক ফন্ট স্টাইল । }
০১২৩৪৫৬৭৮৯
\end{document}
更多详情:
SolaimanLipi 字体没有左右引号。
更改为更新的字体或覆盖范围更大的字体是最优的解决方案。
例如,FreeSerif 字体有孟加拉语字母、左引号和右引号以及天城文数字。
保留原始字体并添加其他字体的字形可以通过多种方式完成。
xelatex 的包ucharclasses
就是为此设计的。
通过多种方式,无包的 xelatex/lualatex 解决方案也是可行的。
(A)使用 expl3 正则表达式命令将重音符号 `` 和单引号替换'
为适当字体的左引号和右引号。
MWE 中的实现使用文档范围的正则表达式环境,因此当将新的字符组合引入文档并且这些字符组合无意中与正则表达式匹配时,就会出现某种程度的破坏。
搜索紧接着任何孟加拉语字符的重音符号的正则表达式如下所示:
\regex_replace_all:nnN %opening quote
{
([\`]+) ([ঀ-]{1}) % Bengali glyphs: 0980 to 09FF
}
{
\cB\{ \c{formatquotes} \1 \cE\} \2 } \l_myxuchar_tl
(B)使用 expl3 replace_all 功能将自定义唯一标记代码(qmnl
和qmnr
示例中的)替换为格式化的引号。
用户必须在正确的位置输入标记代码。
等效的替换函数生成左引号(U+2018),如下所示:
% Replace shortcut
\tl_replace_all:Nnn \l_myxuchar_tl { qmnl } { {\formatquotes ^^^^2018 } }
(C)创建自定义命令(\qmol
和\qmor
示例中的),扩展为格式化的引号。
\newcommand\qmol{{\formatquotes ^^^^2018}}
(D) 创建一个方便的命令(\qenquote{}
),将(C)中的两个命令应用于作为参数传入的参数,即要引用的文本。
\newcommand\qenquote[1]{{\formatquotes ^^^^2018}#1{\formatquotes ^^^^2019}}
但更实际的是,如果有合适的字体,则可以直接输入(E,'অ'१),如果不能直接访问引号,则\text...
可以使用该命令(F) - 后者可以使用基本字体或使用导入的字体进行格式化。
混合字体时,可能需要花费大量时间来寻找能够很好地结合在一起以便在设计师的环境之外使用的字体。
平均能量损失
\documentclass[12pt,a4paper]{article}
\usepackage[table]{xcolor}
\usepackage{fontspec}
\usepackage{polyglossia}
\defaultfontfeatures{Ligatures=TeX}
\setmainfont[Renderer=HarfBuzz]{Kalpurush}%Times New Roman}
\setmainlanguage[numerals=Bengali,
changecounternumbering=true]{bengali}
\setotherlanguage{english}
%Punctuation (quotes) source:
\newfontfamily\ftpunct{Times New Roman}[Colour=red]%for testing
%Digits: Devanagari
\newfontfamily\ftdigits{Noto Sans Devanagari}[Colour=blue]%for testing
% Bengali
\newfontfamily\bengalifont[Renderer=HarfBuzz,Script=Bengali,AutoFakeBold=4.0,AutoFakeSlant=0.4]{Kalpurush}
\newfontface\bfont{\detokenize{Charu_Chandan_3D_Unicode-Regular}}[Extension=.ttf,
Path=C:/Windows/Fonts/,
Renderer=HarfBuzz,
Script=Bengali,
UprightFont=*,]
\newfontfamily\fall{FreeSerif}[Colour=violet]
%========================
\ExplSyntaxOn
\tl_new:N \l_myxuchar_tl
\tl_new:N \l_myxucharb_tl
\NewDocumentEnvironment{xuchare}{ +b }
{
\tl_set:Nn \l_myxuchar_tl { #1 }
\doxuchar
\tl_use:N \l_myxuchar_tl
}{}
\NewDocumentCommand{\xuchar}{ m }
{
\tl_set:Nn \l_myxucharb_tl { #1 }
\doxucharb
\tl_use:N \l_myxucharb_tl
}{}
%------------------------------- print and run #1
\tl_new:N \l_my_tl
\NewDocumentCommand{\cdr}{ m }{%
\tl_set:Nn \l_my_tl { #1 }
{ \ttfamily\color{blue}
% \token_to_str:N #1
\detokenize{#1}
}
\enspace $\mapsto$ \enspace
\colorbox{ blue!20 }{ \tl_use:N \l_my_tl }
}%
\newcommand\doxuchar{
\regex_replace_all:nnN %opening quote
{
([\`]+)
([ঀ-]{1}) % Bengali glyphs: 0980 to 09FF
}
{
\cB\{
\c{formatquotes}
\1
\cE\}
\2
}
\l_myxuchar_tl
\regex_replace_all:nnN %closing quote
{
([ঀ-]{1}) % Bengali glyphs: 0980 to 09FF
([\']+)
}
{
\1
\cB\{
\c{formatquotes}
\2
\cE\}
}
\l_myxuchar_tl
% Replace shortcut
\tl_replace_all:Nnn \l_myxuchar_tl { qmnl } { {\formatquotes ^^^^2018 } }
\tl_replace_all:Nnn \l_myxuchar_tl { qmnr } { {\formatquotes ^^^^2019 } }
%Bengali digits to Devanagari
\tl_replace_all:Nnn \l_myxuchar_tl { ০ } { {\formatdigits ०} }
\tl_replace_all:Nnn \l_myxuchar_tl { ১ } { {\formatdigits १} }
\tl_replace_all:Nnn \l_myxuchar_tl { ২ } { {\formatdigits २} }
\tl_replace_all:Nnn \l_myxuchar_tl { ৩ } { {\formatdigits ३} }
\tl_replace_all:Nnn \l_myxuchar_tl { ৪ } { {\formatdigits ४} }
\tl_replace_all:Nnn \l_myxuchar_tl { ৫ } { {\formatdigits ५} }
\tl_replace_all:Nnn \l_myxuchar_tl { ৬ } { {\formatdigits ६} }
\tl_replace_all:Nnn \l_myxuchar_tl { ৭ } { {\formatdigits ७} }
\tl_replace_all:Nnn \l_myxuchar_tl { ৮ } { {\formatdigits ८} }
\tl_replace_all:Nnn \l_myxuchar_tl { ৯ } { {\formatdigits ९} }
}
\newcommand\doxucharb{
%Bengali digits to Devanagari
\tl_replace_all:Nnn \l_myxucharb_tl { ০ } { {\formatdigits ०} }
\tl_replace_all:Nnn \l_myxucharb_tl { ১ } { {\formatdigits १} }
\tl_replace_all:Nnn \l_myxucharb_tl { ২ } { {\formatdigits २} }
\tl_replace_all:Nnn \l_myxucharb_tl { ৩ } { {\formatdigits ३} }
\tl_replace_all:Nnn \l_myxucharb_tl { ৪ } { {\formatdigits ४} }
\tl_replace_all:Nnn \l_myxucharb_tl { ৫ } { {\formatdigits ५} }
\tl_replace_all:Nnn \l_myxucharb_tl { ৬ } { {\formatdigits ६} }
\tl_replace_all:Nnn \l_myxucharb_tl { ৭ } { {\formatdigits ७} }
\tl_replace_all:Nnn \l_myxucharb_tl { ৮ } { {\formatdigits ८} }
\tl_replace_all:Nnn \l_myxucharb_tl { ৯ } { {\formatdigits ९} }
}
\date{\exp_args:Ne \xuchar { \today } }
\ExplSyntaxOff
\newcommand\formatquotes{\ftpunct}%switch
\newcommand\formatdigits{\ftdigits}%switch
\newcommand\qmol{{\formatquotes ^^^^2018}}
\newcommand\qmor{{\formatquotes ^^^^2019}}
\newcommand\qenquote[1]{{\formatquotes ^^^^2018}#1{\formatquotes ^^^^2019}}
\AtBeginEnvironment{document}{\begin{xuchare}}
\AfterEndEnvironment{document}{\end{xuchare}}
\newcommand\testtext{সাধারন স্টাইল}
\newcommand\eng[1]{\begin{english}#1\end{english}}
\begin{document}
\eng{Digits:}
০১২৩৪৫৬৭৮৯
\bigskip
\begin{tabular}{lllll}
\rowcolor{blue!5}
Method & Command & How & Input & Output \\
\hline
A & expl3 regex & find-replace & \textasciigrave অ\textquotesingle & `অ' \\
B & expl3 replace & find-replace & qmn{}lঅqmn{}r & qmnlঅqmnr \\
C & macros & expand & \textbackslash qmol অ\textbackslash qmor & \qmol অ\qmor \\
D & command & argument & \textbackslash qenquote\{অ\} & \qenquote{অ} \\
E & in font &FreeSerif & direct input: \colorbox{yellow!40}{\fall{^^^^2018অ^^^^2019१}} & \colorbox{yellow!40}{\fall{^^^^2018অ^^^^2019१}} \\
F & commands & kernel & \textbackslash textquoteleft অ\textbackslash textquoteright & \textquoteleft অ\textquoteright \\
\hline
\end{tabular}
\bigskip
\begin{english}
\cdr{\symbol{39}} \quad quotesingle, {\textquotesingle\small becomes quoteright}
\cdr{\symbol{96}} \quad grave accent, {\textasciigrave\small becomes quoteleft}
\cdr{\symbol{8216}} \quad quoteleft
\cdr{\symbol{8217}} \quad quoteright
\cdr{\symbol{8220}} \quad quotedblleft
\cdr{\symbol{8221}} \quad quotedblright
\cdr{\textquotedblleft}
\cdr{\textquotedblright}
\cdr{\textquotedbl}
\cdr{\textquotesingle}
\cdr{\textasciigrave}
\end{english}
\section{কূল্বনন}
কূল্বনন {\bfont `\testtext' \eng{versus} `সাধারন স্টাইল'} \eng{versus} {\bfont `}সাধারন স্টাইল{\bfont '}
\end{document}