忽略空格,包括 ~

忽略空格,包括 ~

标题说明了一切,我怎样才能忽略空格,就像\ignorespacesdoes 一样,但包括一个~

我之所以问这个问题,是因为我们有多位作者编写了一份文档,他们在源代码中输入法语 guillemets 时有不同的习惯(即 、«bla»« bla »«~bla~»,我想通过设置\newunicodechar{«}具有适当定义的 来统一这一点。

对于闭合的 guillemet,\unskip似乎在所有情况下都能起到作用。

答案1

这是一个基于 LuaLaTeX 的解决方案。它定义了一个 Lua 函数来执行大部分工作,以及几个用于激活和停用 Lua 函数的 LaTeX 实用程序宏。我所说的“激活”是指“将 Lua 函数分配给 LuaTeX 的process_input_buffer回调”,以便它可以充当输入流的预处理器TeX 开始其常规处理。

在此处输入图片描述

% !TEX TS-program = lualatex
\documentclass{article}
\usepackage[french]{babel} % for "\og" and "\fg" macros
\usepackage[french=guillemets]{csquotes} % for "\enquote" macro

\usepackage{luacode} % for "luacode" environment
%% Lua-side code
\begin{luacode}
function delete_whitespace ( s )
  s = s:gsub ( "«[ ~]*" , "\\og " )
  s = s:gsub ( "[ ~]*»" , "\\fg " )
  -- s = s:gsub ( "[ ~]+([%:%;%?%!])" , "%1" ) -- if needed
  return s
end
\end{luacode}
%% LaTeX-side code
\newcommand\DeletewhitespaceOn{\luadirect{luatexbase.add_to_callback (
    "process_input_buffer", delete_whitespace , "deletewhitespace" )}}
\newcommand\DeletewhitespaceOff{\luadirect{luatexbase.remove_from_callback (
    "process_input_buffer", "deletewhitespace" )}}
\AtBeginDocument{\DeletewhitespaceOn} % enable by default

\begin{document}
\enquote{bla} \og{}bla\fg{}  «bla»  « bla »  «~bla~»  «~ bla ~ » 

\DeletewhitespaceOff
\enquote{bla} \og{}bla\fg{}  «bla»  « bla »  «~bla~»  «~ bla ~ » 
\end{document}

答案2

使用 expl3 真的很容易(尽管由于相关函数的极端通用性,性能可能不是理想):

%! TEX program = lualatex
\documentclass{article}
\usepackage{newunicodechar}

\ExplSyntaxOn
\newunicodechar{×}{123\ignorespaces}
\newunicodechar{≡}{123\peek_regex_remove_once:nT{(\cA\~|\cS\ )+}{}}
\ExplSyntaxOff

\begin{document}



× 456

×~456 %unfortunately does not work

% all of the below works:
≡ 456

≡~456

≡~~456

≡~ ~ 456

\end{document}

为了在此演示,我使用了 2 个不相关的 Unicode 字符。

通过预编译正则表达式可以稍微优化性能:

\regex_new:N \l_ysalmon_regex
\regex_set:Nn \l_ysalmon_regex {(\cA\~|\cS\ )+}
\newunicodechar{≡}{123\peek_regex_remove_once:NT\l_ysalmon_regex{}}

(根据 OP 的用户名命名的变量。如果需要可以更改)

peek函数系列不能正确处理一些特殊情况,但这种情况非常罕见,在实践中几乎不可能发生。

答案3

删除闭合格线之前的所有胶水、字距和罚分比删除打开格线之后的内容要容易得多。

无论如何,这应该是相当有效的。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{newunicodechar}

\newunicodechar{«}{<<\ignoreallspaces}
\newunicodechar{»}{\removeallspaces~>>}

\ExplSyntaxOn
\NewDocumentCommand{\removeallspaces}{}
 {
  \int_case:nnT { \lastnodetype }
   {
    {11}{\unskip}
    {12}{\unkern}
    {13}{\unpenalty}
   }
   {\removeallspaces}
 }

\NewDocumentCommand{\ignoreallspaces}{}
 {
  \peek_remove_filler:n { \peek_charcode_remove:NT \c_tilde_str { \ignoreallspaces } }
 }

\ExplSyntaxOff

\begin{document}

« ~ a ~~ »

\end{document}

在此处输入图片描述

答案4

我想说的是,babel-french v3.5o 修复了该问题(仅适用于 LuaTeX 引擎):编码«bla»« bla »«~bla~»产生相同的输出。

\documentclass{article}
\usepackage{fontspec}
\usepackage[french]{babel}
\frenchsetup{og=«, fg=»}
\begin{document}
«bla»  « bla »  «~bla~» \frquote{bla}
\end{document}

印刷

在此处输入图片描述

相关内容