短的:有没有办法防止\xspace
在行首插入空格?
长的:我已定义了几个用于普通文本的格式化宏。其中一个(\indoubt
)通常用于文本内部插入注释。在正常上下文中,前一个单词和此宏的输出之间应该只有一个空格,因此我\unskip\xspace
在此宏的开头使用了。但是,我还想显示文档中实际使用的所有格式化宏的列表 - 使用相同的宏输出一些示例文本。(我可以手动编写此文本而不使用\xspace
,但这样做很容易出错,因为如果我更改宏中的格式,我必须记住更改示例文本。)在此列表中,\xspace
就在行的开头。有没有办法从此处删除它?
以下是 MWE:
\documentclass{article}
\usepackage{xspace}
\usepackage{xifthen}
\usepackage{etoolbox}
\makeatletter
\newcommand\addmacro[1]{%
\write\@auxout{\noexpand\@writefile{macros}{#1\newline}}%
}
\newcommand\printmacros{%
\section*{Meaning of formats}%
\@starttoc{macros}%
}
\makeatother
% Once a formatting macro has been used, set the corresponding flag to TRUE
% and write self-formatted explanation to legend
\newcommand{\checkflag}[2]{%
\providebool{flag#1}%
\ifbool{flag#1}
{}
{\global\booltrue{flag#1}%
\addmacro{#2}%
}%
}
% Express doubt if unsure about a word in the text
\newcommand{\indoubt}[1]{%
\checkflag{indoubt}{\protect\indoubt{Macro with leading xspace}}%
\ifthenelse{\equal{#1}{}}
{\unskip{\textbf{\xspace[?]\xspace}}}
{\unskip{\textbf{\xspace[#1]\xspace}}}%
}
\newcommand{\simple}[1]{%
\checkflag{simple}{\simple{Just a plain formatting directive.}}%
\textsc{#1\xspace}%
}
\setlength{\parindent}{0pt}
\begin{document}
\printmacros
\section{Test}
This is some textt\indoubt{Wrong spelling?}~\dots \simple{More text.}
\end{document}
答案1
即使\xspace
你决定忽略它的缺点
是在没有参数的命令后面添加空格(如果命令后面没有标点符号)。
带参数的命令根本没用,因为
blah blah \foo{argument} blah
之后的空格\foo{argument}
与之后的空格不同,\foo
它只是一个普通的空格,并且在输出中不经特殊处理即可出现。
在定义的最后一个标记以外的任何地方使用该\xspace
命令都不会产生任何有用的效果,因为在这种情况下,您总是知道下一个标记是什么,因此 xspace 所做的前瞻和测试毫无用处。{\xspace[...
只是一种缓慢的方法{ [...
我不太确定你想要什么,但也许
\documentclass{article}
\usepackage{xifthen}
\usepackage{etoolbox}
\makeatletter
\newcommand\addmacro[1]{%
\write\@auxout{\noexpand\@writefile{macros}{#1\par}}%\newline is badness10000 "infinitely bad"
}
\newcommand\printmacros{%
\section*{Meaning of formats}%
\@starttoc{macros}%
}
\makeatother
% Once a formatting macro has been used, set the corresponding flag to TRUE
% and write self-formatted explanation to legend
\newcommand{\checkflag}[2]{%
\providebool{flag#1}%
\ifbool{flag#1}%
{}%
{\global\booltrue{flag#1}%
\addmacro{#2}%
}%
}
% Express doubt if unsure about a word in the text
\newcommand{\indoubt}[1]{%
\ifhmode\unskip\space\fi
\checkflag{indoubt}{\protect\indoubt{Macro with leading xspace}}%
\ifthenelse{\equal{#1}{}}%
{\textbf{[?]}}%
{\textbf{[#1]}}%
}
\newcommand{\simple}[1]{%
\checkflag{simple}{\simple{Just a plain formatting directive.}}%
\textsc{#1}%
}
\setlength{\parindent}{0pt}
\begin{document}
\printmacros
\section{Test}
This is some textt\indoubt{Wrong spelling?}~\dots \simple{More text.}
\end{document}