![如何检查宏是否位于行或段落的末尾](https://linux22.com/image/460681/%E5%A6%82%E4%BD%95%E6%A3%80%E6%9F%A5%E5%AE%8F%E6%98%AF%E5%90%A6%E4%BD%8D%E4%BA%8E%E8%A1%8C%E6%88%96%E6%AE%B5%E8%90%BD%E7%9A%84%E6%9C%AB%E5%B0%BE.png)
我需要一个宏,当它位于行尾时,它会有不同的行为。有什么方法可以检查这样的情况吗?
\documentclass[11pt]{memoir}
\newcommand{\test}{
% if at the end of line
% Print A
% else
% Print B
}
\begin{document}
Hello, \test how are you doing? % Should print B
Hello, how are you doing? \test % Should print A
\test Hello, how are you doing? % Should print B
\end{document}
谢谢
编辑:我真正的意思是在段落的末尾,但我将保留原问题,因为有很好的答案可以检查行的末尾和段落的末尾。
答案1
在 TeX 中,检查控制序列是否位于“行尾”通常是不可能的,因为在标记化过程中,行尾会被转换为空格(如果行尾跟在控制字后面,则会被完全忽略)。能但是,请检查 是否\test
后面跟着\par
。
\documentclass[11pt]{memoir}
\makeatletter
\newcommand{\test}{%
\@ifnextchar\par{A}{B}%
}
\makeatother
\begin{document}
Hello, \test how are you doing? % Should print B
Hello, how are you doing? \test % Should print A
\test Hello, how are you doing? % Should print B
\end{document}
答案2
如果您假设内容尚未标记,则这是可能的(粗略地说,该命令未在其他命令的“参数”中使用,或\verb|...|
失败的地方)
基本思想是存储当前的inputlineno,再标记一个标记,然后将inputlineno与其进行比较。
\documentclass{article}
\usepackage{tikz}
\def\test{%
\count0=\inputlineno
\futurelet\tmptoken\testb
}
\def\testb{%
\ifnum\count0=\inputlineno
middle of line%
\else
end of line%
\fi
}
\usepackage{hyperref}
\begin{document}
middle of line = \test.
end of line = \test
= \test%
...
\textbf{inside a ``normal'' command argument it will always return middle of line: \test
}
\begin{tikzpicture}
\node [text width = 10cm] at (0, 0) {(I mean, Ti\emph{k}Z node text is not a ``normal'' command argument, see \url{https://tex.stackexchange.com/q/345871/250119}) \test
};
\end{tikzpicture}
\end{document}