通过重复字符填补空白

通过重复字符填补空白

我想创建一个这样的宏\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}

结果波浪形

由于缩放,波的长度在具有不同线长度的宏调用之间略有不同。

相关内容