我想创建一个这样的宏\mymacro
,它有四个参数;第一个和第四个参数是任意字母,第二个参数是字符,第三个参数是长度。当我说
\mymacro{م}
{ـ} % this is the Kashida
{100pt}
{ن}
我希望尽可能多的 Kashidas 能够完全填充 100pt 的长度,这样就不会出现空白。这将产生类似 的结果مــــــــــــــــــــــن
。
这是一个简单的例子:
\documentclass{article}
\usepackage{fontspec}
\setmainfont[ExternalLocation,Scale=3]{amiri-regular}
\begin{document}
مــــــــــــــــــــــن
\end{document}
编辑:我已经亲自尝试过David的解决方案:
\documentclass{article}
\usepackage{fontspec}
\setmainfont[ExternalLocation,Scale=3,Script=Arabic]{amiri-regular}
\usepackage{bidi}
\setRTL
\chardef\myzwj="200D
\newcommand\mymacro[4]{\makebox[#3]{#1\myzwj\leaders\hbox{#2}\hfill\myzwj#4}}
\begin{document}
مــــــــــــــــــــــن
\mymacro{م}
{ـ} % this is the Kashida
{100pt}
{ن}
\end{document}
但是中间还是留有一些空隙(这是我需要避免的)。参见下图:
回答 Heiko 的问题:
如果空间不是基本单位的整数倍,那么未占用的空间会去哪里?
宏应该足够智能,能够计算出 100pt 中可以容纳多少个 Kashida。假设 100pt 中可以容纳 15.5 个 Kashida,则宏应该放置 15.5 个 Kashida 以完全填满 100pt 的长度(完全没有空白)。
答案1
或者可能\beginL
添加等来强制方向。
\documentclass{article}
\usepackage{fontspec}
\setmainfont[ExternalLocation,Scale=3]{amiri-regular}
\newcommand\mymacro[4]{\makebox[#3]{#1\leaders\hbox{#2}\hfill#4}}
\begin{document}
مــــــــــــــــــــــن
\mymacro{م}
{ـ} % this is the Kashida
{100pt}
{ن}
\end{document}
添加一些叠印以解决非整数个填充字符和一些负空间的问题
\documentclass{article}
\usepackage{fontspec}
\setmainfont[ExternalLocation,Scale=3]{amiri-regular}
\newcommand\mymacro[4]{#4\kern-1pt\rlap{#2}%
\makebox[#3]{\leaders\hbox{#2}\hfill}%
\llap{#2}\kern-1pt#1}
\begin{document}
مــــــــــــــــــــــن
\mymacro{م}
{ـ} % this is the Kashida
{100pt}
{ن}
\end{document}
答案2
此答案通过缩放线条字符来提供线条。仔细观察字符边界框会发现,有一些倾斜的部分粘在左侧和右侧。缩放也会改变倾斜部分的角度。因此,实现用三个部分构造线条:
- 通过剪切字形的其余部分来开始部分
- 缩放字形的主要中间部分
- 通过剪切字形的其余部分来结束部分
例子:
\documentclass{article}
\usepackage{fontspec}
\setmainfont[ExternalLocation,Scale=3]{amiri-regular}
\usepackage{graphicx}
\usepackage{trimclip}
\usepackage[RTLdocument]{bidi}
\newcommand*{\mymacro}[4]{%
\leavevmode
#1%
\llap{\clipbox{-1ex 0pt {\width} 0pt}{#2}}%
\resizebox{#3}{\height}{\clipbox{0pt}{#2}}%
\rlap{\clipbox{{\width} 0pt -1ex 0pt}{#2}}%
#4%
}
\begin{document}
% show bounding box:
\setlength{\fboxsep}{0pt}
\setlength{\fboxrule}{.1pt}
\scalebox{4}{\fbox{ـ}}
\medskip
مــــــــــــــــــــــن
\mymacro{م}{ـ}{100pt}{ن}
\mymacro{م}{ـ}{200pt}{ن}
\end{document}
略带波浪线的变化
下一个示例每次添加一个线形符号,直到长度小于或等于所需长度。然后将线缩放到所需长度。
由于长度不是字形数量的线性函数,因此该示例每次添加一个字形并测试长度。
\documentclass{article}
\usepackage{fontspec}
\setmainfont[ExternalLocation,Scale=3]{amiri-regular}
\usepackage{graphicx}
\usepackage{trimclip}
\usepackage[RTLdocument]{bidi}
\makeatletter
\newcommand*{\mymacro}[4]{%
\leavevmode
#1%
\ifdim#3>\z@ % 0pt
\begingroup
\def\glyphline{#2}%
\settowidth{\dimen@}{\glyphline}%
\let\next@glyphline\glyphline
\@whiledim#3>\dimen@\do{%
\let\glyphline\next@glyphline
\expandafter
\def\expandafter\next@glyphline\expandafter{\glyphline#2}%
\settowidth{\dimen@}{\next@glyphline}%
}%
\llap{\clipbox{-1ex 0pt {\width} 0pt}{\glyphline}}%
\resizebox{#3}{\height}{\clipbox{0pt}{\glyphline}}%
\rlap{\clipbox{{\width} 0pt -1ex 0pt}{\glyphline}}%
\endgroup
\fi
#4%
}
\makeatother
\begin{document}
مــــــــــــــــــــــن
\mymacro{م}{ـ}{50pt}{ن}
\mymacro{م}{ـ}{100pt}{ن}
\mymacro{م}{ـ}{150pt}{ن}
\mymacro{م}{ـ}{200pt}{ن}
\end{document}
由于缩放,波的长度在具有不同线长度的宏调用之间略有不同。