Я использую пакет philex
для лингвистических примеров и пытаюсь поместить текстовый элемент в конец строки (справа по центру). Я пытался использовать команду \hfill
, но, как покажет вам MWE, она не обеспечивает последовательного выравнивания.
\documentclass[12pt]{beamer}
\usepackage[francais]{babel}
\usepackage{philex}
\begin{document}
\begin{frame}{The syntactic ambiguity}
\lb{}{
\lba{}{Fred eats an apple. \hfill (a)}
\lbz{}{Fred eats an apple. \hfill (a)}
}
\end{frame}
\end{document}
Может ли кто-нибудь помочь мне исправить это странное поведение?
решение1
Вам следует избегать philex
по причинам, которые egreg приводит в своем ответе. Наиболее часто используемые пакеты для набора лингвистических примеров:gb4e
,expex
, иlinguex
(который загружен philex
). СмотретьПревосходное сравнение этих пакетов от Алана Маннадля получения более подробной информации. Многие из функций, которые philex
добавляют linguex
(перекрестные ссылки, повторение примеров, настройка меток и т. д.), доступны в expex
.
Все эти пакеты позволяют вам иметь выравнивание комментария по правому краю. Смотрите ответы наМаркировка лингвистических примеров с использованием языковой информациидля кода, иллюстрирующего, как это сделать в каждом пакете. expex
— единственный, который предоставляет собственную команду для этих выровненных по правому краю комментариев: \rightcomment
.
решение2
Причина в том, что philex
пакет написан ужасно и не защищает концы строк в определениях. Пробел, который вы видите, вызван в основном этими незащищенными пробелами.
ВидетьКогда вредно добавлять символ процента в конце строк в \newcommand или подобномЧтобы получить больше информации.
Слишком много незащищенных концов строк, чтобы предлагать исправление; также есть проблема в том, что определения макросов очень большие и не используют модульность.
Вы можете «исправить» проблему, применив дикий хак; однако это может дать неожиданные результаты, если пробел действительно необходим в какой-то точке определения.
\documentclass{article}
\usepackage{showframe}
\endlinechar=-1
\usepackage{philex}
\endlinechar=13
\begin{document}
\lb{y}{%
\lba{y1}{Fred eats an apple. \hfill (a)}%
\lbz{y2}{Fred eats an apple. \hfill (a)}%
}
\end{document}
Обратите внимание, что конец строк должен быть защищен также на входе. Пакет showframe
предназначен только для демонстрации выравнивания по краю.
Реальное решение — не использовать пакет и попросить его сопровождающего исправить плохой код.
Просто для примера приведем определение \lb
(номера строк добавлены для удобства):
95 \newcommand{\lb}[3][n]{
96 \ifdim\lastskip=\Extopsep\vspace\Exredux\else \fi
97 \immediate\write\@auxout{\unexpanded{\expandafter\gdef\csname#2r\endcsname{#3}\expandafter\gdef\csname#2\endcsname{\ref{#2}}
98 \expandafter\gdef\csname#2p\endcsname{\MakeLowercase#3}}}
99 \expandafter\providecommand\expandafter{\csname#2r\endcsname}{#3}
100 \expandafter\providecommand\expandafter{\csname#2\endcsname}{\ref{#2}}\expandafter\providecommand\expandafter{\csname#2p\endcsname}{\MakeLowercase#3}
101 \ifhyperref%
102 \renewcommand{\theFnExNo}{\roman{FnExNo}}
103 \ex. \label{#2} \if#1c \setlength{\abovedisplayskip}{1ex}
104 \setlength{\belowdisplayskip}{2ex}%
105 \parbox{\centro}{\centering \hypertarget{#2}{#3}\philpunct}\else \hypertarget{#2}{#3}\philpunct\fi\par
106 \else
107 \ex. \label{#2} \if#1c \setlength{\abovedisplayskip}{1ex}\setlength{\belowdisplayskip}{2ex}%
108 \parbox{\centro}{\centering #3\philpunct}\else #3\philpunct\fi\par%
109 \fi}
%
В конце строк 95, 97, 98, 99, 100, 102 и 103 отсутствуют символы. %
В конце строк 101 и 108 символы лишние (строка заканчивается контрольным словом). Единственные правильно размещенные %
символы находятся в конце строк 104 и 107.
Определение \lba
также несовершенно.