如何检查宏是否位于行或段落的末尾

如何检查宏是否位于行或段落的末尾

我需要一个宏,当它位于行尾时,它会有不同的行为。有什么方法可以检查这样的情况吗?

\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}

输出

相关内容