![Проблема с расширением \@ifnextchar внутри табличной среды](https://rvso.com/image/305898/%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0%20%D1%81%20%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC%20%5C%40ifnextchar%20%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B8%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D0%B9%20%D1%81%D1%80%D0%B5%D0%B4%D1%8B.png)
Я хотел бы определить макрос, который расширяется в табличную среду \hline
и \cline
внутри нее в зависимости от следующего символа:
\documentclass{standalone}
\makeatletter
\def\mycline[#1]{\cline{#1}}
\def\myline{\@ifnextchar[{\mycline}{\hline}} % Does not work. Either misplaced \noalign or \omit
\makeatother
\begin{document}
\begin{tabular}{cc}
a1 & a2 \\
\myline
b1 & b2 \\
\myline[1-2]
\end{tabular}
\end{document}
К сожалению, это приводит к неправильному расположению \noalign
или \omit
(или и того, и другого). Кажется, что это \@ifnextchar
не полностью расширяется со временем. Есть идеи?
решение1
Из-за особенностей \noalign
работы сканирования нерасширяемая команда (здесь \futurelet
используется \@ifnextchar
) начинает новую ячейку выравнивания, и вставлять строку уже поздно.
Вам необходимо выполнить сканирование на предмет необязательного аргумента внутри \noalign
группы:
\documentclass{standalone}
\makeatletter
\def\myline{%
\noalign\bgroup
\@ifnextchar[%
{\aftergroup\mycline\egroup}%
{\aftergroup\hline\egroup}%
}
\def\mycline[#1]{\cline{#1}}
\makeatother
\begin{document}
\begin{tabular}{cc}
a1 & a2 \\
\myline
b1 & b2 \\
\myline[1-1]
c1 & c2
\end{tabular}
\end{document}
Зачем ты ищешь неприятностей?;-)