忽略空格,包括~

忽略空格,包括~

標題說明了一切,我怎麼能像那樣忽略空格\ignorespaces,但包括一個~

«bla»我問的原因是我們有多個作者在編寫文檔,他們在原始程式碼中輸入法語 guillemets(即、« bla »和)方面有不同的習慣«~bla~»,我想透過設定 a\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»or« bla »«~bla~»產生相同的輸出。

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

印刷

在此輸入影像描述

相關內容