`\Hy@raisedlink` 阻止连字并干扰换行

`\Hy@raisedlink` 阻止连字并干扰换行

\Hy@raisedlink因为这个答案中解释过:https://tex.stackexchange.com/a/17138/7712) 似乎会给连字符带来麻烦。

参见此 MWE

 \documentclass[a4paper]{book}
\usepackage[a4paper]{geometry}
\usepackage{polyglossia,fontspec,hyperref}
\setmainfont{Linux Libertine O}
\setmainlanguage{greek}

\makeatletter
\newcommand\test{6. Καὶ δὴ τῷ κράτει
    \edtext{τοῦ} \edtext{συγγενέος} \edtext{ἐπιθαρσήσας}, \edtext{οὐμενοῦν}
    \edtext{εἴ τι}
καὶ \edtext{δέοι}
παθεῖν
δείσας
καλὴν ἑαυτῷ
τῆς εἰς Χριστὸν πίστεως, τὴν ἐν
    \edtext{Γράμματι}
νομοθεσίαν,
ὑποβάθραν
    \edtext{προύθηκεν}.
    \edtext{Περιτυχὼν}
γὰρ
    \edtext{τῶν}, \edtext{Μωσαικῶν}
    \edtext{βιβλίων},
καὶ
    \edtext{τῆς Ἐβραίων ἁπάσης Γραφῆς},
καὶ τούτοις ὡς μάλιστα φιλομαθῶς
    \edtext{ἐναπασχολήσας}τὸν νοῦν, καὶ
    \edtext{ὅλος}
    \edtext{ὅλῳ}
στοιχειωθεὶς,}


\begin{document}


\section{Good}
\def\edtext#1{#1}
\test


\section{Bad}
\def\edtext#1{\Hy@raisedlink{}#1\Hy@raisedlink{}}


\test

\section{Better}
\def\edtext#1{\Hy@raisedlink{}\hspace{0pt}#1\Hy@raisedlink{}\hspace{0pt}}

\test

\section{Ok?}
\def\edtext#1{\Hy@raisedlink{}\hspace{0pt}#1\Hy@raisedlink{}}


\test


\end{document}

不带\edtext\Hy@raisedlink可以产生好的连字符 / ,带 的则不行\Hy@raisedlink。@Ulrike Fischer 建议的版本更好,但不是那么好。理想情况下,所有行都应该像示例 1 中那样,不带 \Hy@raisedlink{}。

答案1

我在一个法国网站上问过同样的问题,http://texnique.fr

一位用户 (@unbonpetit) 给了我一个很好的答案。我将其复制在这里。

问题在于 增加的惩罚\Hy@raisedlink。@UlrikeFischer 提出的添加解决方案\hspace{0pt}并不好,因为它会为换行创建新节点,并且会产生诸如行末逗号后出现水平空格之类的不良现象。

因此,@unbonpetit 看到的唯一解决方案是创建一个新的宏\Hy@raisedlink@left,类似于\Hy@raisedlink但在单词的开头(左侧)调用。它用于\llap不干扰间距和断行。

\documentclass[a4paper]{book}
\usepackage[a4paper]{geometry}
\usepackage{polyglossia,fontspec,hyperref,xcolor}
\setmainfont{Linux Libertine O}
\setmainlanguage{greek}

\makeatletter
\def\Hy@raisedlink@left#1{%
    \ifvmode
        #1%
    \else
        \Hy@SaveSpaceFactor
        \llap{\smash{% \llap{ added
        \begingroup
            \let\HyperRaiseLinkLength\@tempdima
            \setlength\HyperRaiseLinkLength\HyperRaiseLinkDefault
            \HyperRaiseLinkHook
        \expandafter\endgroup
        \expandafter\raise\the\HyperRaiseLinkLength\hbox{%
            \Hy@RestoreSpaceFactor
            #1%
            \Hy@SaveSpaceFactor
        }%
        }}% } to close \llap
        \Hy@RestoreSpaceFactor
        \penalty\@M\hskip\z@ 
    \fi
}

\newcommand\test{6. Καὶ δὴ τῷ κράτει
    \edtext{τοῦ} \edtext{συγγενέος} \edtext{ἐπιθαρσήσας}, \edtext{οὐμενοῦν}
    \edtext{εἴ τι} καὶ \edtext{δέοι} παθεῖν δείσας καλὴν ἑαυτῷ
    τῆς εἰς Χριστὸν πίστεως, τὴν ἐν \edtext{Γράμματι} νομοθεσίαν,
    ὑποβάθραν \edtext{προύθηκεν}. \edtext{Περιτυχὼν} γὰρ \edtext{τῶν},
    \edtext{Μωσαικῶν} \edtext{βιβλίων}, καὶ \edtext{τῆς Ἐβραίων ἁπάσης Γραφῆς},
    καὶ τούτοις ὡς μάλιστα φιλομαθῶς \edtext{ἐναπασχολήσας}τὸν νοῦν, καὶ
    \edtext{ὅλος} \edtext{ὅλῳ}
στοιχειωθεὶς,}

\begin{document}

\section{Good}
\def\edtext#1{#1}
\test

\section{Bad}
\def\edtext#1{\Hy@raisedlink@left{}#1\Hy@raisedlink{}}
\test

\end{document}

请参阅原始答案

相关内容