Бимер, philex и \hfill

Бимер, philex и \hfill

Я использую пакет 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также несовершенно.

Связанный контент