希伯来语文档中的两个边注中的第二个边注叠加在正文上

希伯来语文档中的两个边注中的第二个边注叠加在正文上

通过最小工作示例演示问题

我将以下 LaTeX 代码保存在 中~/Test.tex

\documentclass{article}
\usepackage[bidi=basic,hebrew,provide=*,layout=graphics]{babel}
\babelfont{rm}[Renderer=HarfBuzz]{FreeSans}
\usepackage{marginnote}
\usepackage{xcolor}
\begin{document}
מכל אלה שהתהלכתי אתם פעם בעיר מולדתי יקרה לי ביחוד%
\marginnote{\textcolor{blue}{%
שלום רב שובך, ציפורה נחמדת, מארצות החום אל חלוני.%
}} %LTR
בת שכננו מינה, אשר קראו לה גם בשם הגנאי ה’ברודה',%
\marginnote{\textcolor{red}{%
אל קולך כי ערב מה-נפשי כלתה בחורף בעוזבך מעוני.
}}% LTR
והיא נערה מנומרת בכתמי שמש שלא חוננה אמנם ביופי, אבל הן כבר ידוע המשפט של כלי החרס אשר בהם ישומר היין הטוב, וראינו גם אשר דברי אלהים חיים נכתבים על גויל פשוט.
\end{document}

代码创建了一个类为 的文档article,将其主要(也是唯一的)语言设置为希伯来语,并在文档主体中写入一段希伯来语文本,其中两个marginnote希伯来语文本嵌入在两个位置。第一个文本marginnote为蓝色,而第二个文本为红色。

在编译代码之前,我采取了预防措施来避免marginnote有关希伯来语文档中的 s 的已知问题,通过实施变体大卫·卡莱尔的黑客行为marginnote.sty:我制作了(原版于)的本地副本/usr/local/texlive/2022/texmf-dist/tex/latex/marginnote/,并将其第 363 行替换为:\rlap{\kern-2.7\marginparwidth%参见脚注

然后我在终端中执行了以下命令。

> cd ~
> lualatex Test
> lualatex Test

编译成功完成,没有任何警告~/Test.log;特别是,没有建议重新运行编译的警告。

编译的结果是~/Test.pdf创建了文件。在 PDF 查看器中打开此文件时,显示如下。(我仅截取了显示的相关部分。)

希伯来语文档中的两个希伯来语边注

可以看出,第一个(蓝色)marginnote在边缘位置正确,但第二个(红色)marginnote叠加在正文上。


问题

  1. 为什么第二个边注会叠加在正文上?
  2. 我该怎么做才能修复第二个(以及任何其他)边注的位置,同时保留第一个边注的现在正确位置?

脚注

这是 Udi Fogiel 对我之前一篇现已删除的帖子的评论(由于与这个问题),他让我意识到了这个 hack,并建议进行必要的改动以使其适应我使用的babel+组合。lualatex

答案1

此处似乎是正确的值。注意!它不处理 reversemarginpar,并且 twoside 尚未测试。

\documentclass{article}
\usepackage[bidi=basic,hebrew,provide=*,layout=graphics]{babel}
\babelfont{rm}[Renderer=HarfBuzz]{FreeSans}
\usepackage{marginnote}
\usepackage{xcolor,xpatch}
\makeatletter
\patchcmd\@mn@@@marginnote{\kern-\dimexpr\@mn@currxpos}{\kern\dimexpr\@mn@currxpos}{}{\fail}
\patchcmd\@mn@@@marginnote{\kern\oddsidemargin}{\kern-\oddsidemargin}{}{\fail}
\patchcmd\@mn@@@marginnote{\kern\oddsidemargin}{\kern-\oddsidemargin}{}{\fail}
\patchcmd\@mn@@@marginnote{\kern\evensidemargin}{\kern-\evensidemargin}{}{\fail}
\patchcmd\@mn@@@marginnote{\kern 1in}{\kern-1in}{}{\fail}
\patchcmd\@mn@@@marginnote{\kern\marginnotetextwidth}{}{}{\fail}
\makeatother


\begin{document}
מכל אלה שהתהלכתי אתם פעם בעיר מולדתי יקרה לי ביחוד%
\marginnote{\textcolor{blue}{%
שלום רב שובך, ציפורה נחמדת, מארצות החום אל חלוני.%
}} %LTR
בת שכננו מינה, אשר קראו לה גם בשם הגנאי ה’ברודה',%
\marginnote{\textcolor{red}{%
אל קולך כי ערב מה-נפשי כלתה בחורף בעוזבך מעוני.
}}% LTR
והיא נערה מנומרת בכתמי שמש שלא חוננה אמנם ביופי, אבל הן כבר ידוע המשפט של כלי החרס אשר בהם 
ישומר היין הטוב, וראינו גם אשר דברי אלהים חיים נכתבים על גויל פשוט. 
',%
\marginnote{\textcolor{green}{%
אל קולך כי ערב מה-נפשי כלתה בחורף בעוזבך מעוני.
}}% LTR
והיא נערה מנומרת בכתמי שמש שלא חוננה אמנם ביופי, אבל הן כבר ידוע המשפט של כלי החרס אשר בהם 
ישומר היין הטוב, וראינו גם אשר דברי אלהים חיים נכתבים על גויל פשוט. 
\end{document}

在此处输入图片描述

答案2

有趣的是,marginnote它考虑了 RTL 文本,但此功能仅在bidi加载时才激活。显然,可以通过以下方式作弊:

\documentclass{article}
\usepackage[bidi=basic,hebrew,provide=*,layout=graphics]{babel}
\babelfont{rm}[Renderer=HarfBuzz]{FreeSans}

\makeatletter
\newif\if@RTL  \@RTLtrue  % Pretend that `bidi` has been loaded 
\makeatother

\usepackage{marginnote}
\usepackage{xcolor}

\begin{document}
מכל אלה שהתהלכתי אתם פעם בעיר מולדתי יקרה לי ביחוד%
\marginnote{\textcolor{blue}{%
שלום רב שובך, ציפורה נחמדת, מארצות החום אל חלוני.%
}} %LTR
בת שכננו מינה, אשר קראו לה גם בשם הגנאי ה’ברודה',%
\marginnote{\textcolor{red}{%
אל קולך כי ערב מה-נפשי כלתה בחורף בעוזבך מעוני.
}}% LTR
והיא נערה מנומרת בכתמי שמש שלא חוננה אמנם ביופי, אבל הן כבר ידוע המשפט של כלי החרס אשר בהם ישומר היין הטוב, וראינו גם אשר דברי אלהים חיים נכתבים על גויל פשוט.
\end{document}

答案3

在加载包之后,添加以下一段代码marginnote到(希望)正确的marginnote\@mn@if@RTL用于测试当前文本流是否为 RTL。

\usepackage{ifthen}
\makeatletter
\renewcommand*{\@mn@if@RTL}%
{%
   \ifthenelse%
   {\equal{\the\textdir}{\detokenize{TRT}}}%
   {\@firstoftwo}%
   {\@secondoftwo}%
}
\makeatother

如果 LTR 文本中有边注,也应该加载该geometry包,我不知道为什么,但是否则边注的水平对齐就会有点偏离。

该解决方案依赖于LuaTeX引擎的寄存器\textdir,因此只能与LuaTeX一起使用。


文档中同时包含文本和数学运算的示例,其语言通过设置为希伯来语babel

\documentclass[12pt]{article}

\usepackage[showframe]{geometry}

\usepackage[bidi=basic,hebrew,provide=*]{babel}
\babelfont{rm}{FreeSans}

\usepackage{lipsum}

\usepackage{marginnote}

% marginnote fix begin
\usepackage{ifthen}
\makeatletter
\renewcommand*{\@mn@if@RTL}%
{%
   \ifthenelse%
   {\equal{\the\textdir}{\detokenize{TRT}}}%
   {\@firstoftwo}%
   {\@secondoftwo}%
}
\makeatother
% marginnote fix end
\begin{document}
\lipsum[1-1][1-1] \marginnote{Margin note in text mode}
\lipsum[1-1][2-8]
\reversemarginpar
\[
x + y = z\marginnote{Margin note in math mode}
\]
\end{document}

希伯来语文档中的文本和数学边注


原帖示例:

\documentclass{article}
% \usepackage[pass]{geometry}
\usepackage[bidi=basic,hebrew,provide=*,layout=graphics]{babel}
\babelfont{rm}[Renderer=HarfBuzz]{FreeSans}
\usepackage{marginnote}
\usepackage{xcolor}

% marginnote fix begin
\usepackage{ifthen}
\makeatletter
\renewcommand*{\@mn@if@RTL}%
{%
   \ifthenelse%
   {\equal{\the\textdir}{\detokenize{TRT}}}%
   {\@firstoftwo}%
   {\@secondoftwo}%
}
\makeatother
% marginnote fix end
\begin{document}
מכל אלה שהתהלכתי אתם פעם בעיר מולדתי יקרה לי ביחוד%
\marginnote{\textcolor{blue}{%
שלום רב שובך, ציפורה נחמדת, מארצות החום אל חלוני.%
}} %LTR
בת שכננו מינה, אשר קראו לה גם בשם הגנאי ה’ברודה',%
\marginnote{\textcolor{red}{%
אל קולך כי ערב מה-נפשי כלתה בחורף בעוזבך מעוני.
}}% LTR
והיא נערה מנומרת בכתמי שמש שלא חוננה אמנם ביופי, אבל הן כבר ידוע המשפט של כלי החרס אשר בהם ישומר היין הטוב, וראינו גם אשר דברי אלהים חיים נכתבים על גויל פשוט.
\end{document}

两个重叠的边注

在这种情况下,包的加载geometry是可选的,因为文本完全是 RTL。


致谢

  1. Ulrike Fischer告诉我关于\textdir登记册的事

  2. 大卫·卡莱尔向我展示如何查询上述寄存器


评论

这并非完美的解决方案。有些情况下,尽管实施了此解决方案,但页边注仍会放错位置,例如以下示例,其中文档的左右页边距不对称。

\documentclass{article}
\usepackage[hmarginratio=1:3,showframe]{geometry}

\usepackage[bidi=basic, english, hebrew, provide=*]{babel}
\babelfont{rm}{FreeSans}

\usepackage{marginnote}

\usepackage{ifthen}
\makeatletter
\renewcommand*{\@mn@if@RTL}%
{%
   \ifthenelse%
   {\equal{\the\textdir}{\detokenize{TRT}}}%
   {\@firstoftwo}%
   {\@secondoftwo}%
}
\makeatother
\usepackage{lipsum}
\begin{document}
\reversemarginpar
\[%LTR
x + y = z\marginnote{math note}
\]
\normalmarginpar
word\marginpar{text note}
\end{document}

边缘不对称

相关内容