使用 lualatex 自动格式化全大写段落

使用 lualatex 自动格式化全大写段落

我想对较长文本中的所有大写段落应用特定格式,特别是使用以下格式进行跟踪/字母间距fontspec机制的跟踪/字母间距,以便可以针对不同的字体样式进行调整。我有一个宏可以很好地完成此操作,但我真的希望该宏能够自动应用于文本。因此,我尝试调整关于给特定词语着色的已接受答案大多数情况下都是有效的:

% !TEX TS-program = lualatex
\documentclass[12pt]{book}

\usepackage{fontspec} 


\newcommand{\TEST}{Write out “TEST”!}
\newcommand{\test}{Write out “TEST”!}


%use underline for testing as it makes it easier to see where the command actually is applied 
\usepackage{ulem}

\usepackage{luacode} % for "luacode" environment and "\luastring" macro

%% Lua-side code
\begin{luacode}
function letterspace ( buff )
   buff = string.gsub ( buff, [[([ “]*)([A-Z][A-Z]+)([”,.;:?%!- ]*)]],  "\\emph{%1%2%3}" )
   return buff
end
\end{luacode}
%% TeX-side code
\newcommand\letterspaceOn{\directlua{luatexbase.add_to_callback 
   ( "process_input_buffer" , letterspace , "letterspace" )}}
\newcommand\letterspaceOff{\directlua{luatexbase.remove_from_callback 
   ( "process_input_buffer" , "letterspace" )}}
\AtBeginDocument{\letterspaceOn} % turn Lua function on by default

\begin{document}

\chapter{The quick brown fox jumps OFF OF A cliff}  

\section{Zorro juMPs over the lazy dog}

(EVERY

EVERY

“EVERY”

EVERY day, foo's foo doesn't foo.)

THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG.

quick THE quick A! brown fox JUMPS OVER the lazy dog.

Another “quick” brown fox

\test

%Problematic lines:
%THE “QUICK”, BROWN FOX! JUMPS OVER? THE LAZY DOG.

%\TEST

%{\LARGE test TEST}

\letterspaceOff  % switch off the Lua function
The quick brown fox JUMPS! over the lazy dog.

THE QUICK, BROWN FOX! JUMPS OVER? THE LAZY DOG.

THE “QUICK”, BROWN FOX! JUMPS OVER? THE LAZY DOG.

\TEST

{\LARGE test TEST}

\letterspaceOn   % switch Lua function back on
The quick brown fox JUMPS! over the lazy dog.


\end{document}

仍存在几个问题(MWE 中注释掉的行):

  1. 包含全大写的 LaTeX 命令已被排除在匹配之外。RegEx 提供了可以使用的负面后视,但我不熟悉 lua 的模式匹配,找不到合适的等效项。

  2. 我不明白为什么我会得到“字符串包含无效的 utf-8 序列”错误,因为“QUICK” 周围的引号是这样的。

  3. 完美的解决方案还会对宏写的单词“TEST”加下划线(字母空格),\test但这只是锦上添花。

答案1

LuaTeX 捕获不是 REGEX,它们非常有限,因此需要小心。LPEG 模块更好,但在我看来语法较难,学习难度较高。

安装回调很危险,因为 TeX 会读取整行然后交给 Lua。因此,您将在诸如 之类的命令下划线{\LARGE \TEST}。最好始终使用标记来界定捕获。在下面的示例中,我使用了两个反引号 (``)。最好使用unicode.utf8.gsub而不是字符串转换

\documentclass[12pt]{book}
\usepackage{fontspec,textcase} 
\usepackage{luacode} 
\newcommand\textsmallcaps[1]{\textsc{\MakeTextLowercase{#1}}}

\begin{luacode}

function letterspace ( buff )
  buff = unicode.utf8.gsub (buff, '[`][`](.+)[`][`]',   function(w)
               if w ~=nil then 
                   return '\\textsmallcaps{'..w..'}' 
               else
                 return buff
               end      
             end  
           ) 
  return buff         
end
\end{luacode}

\newcommand\letterspaceOn{\directlua{luatexbase.add_to_callback 
   ( "process_input_buffer" , letterspace , "letterspace" )}}
   
\newcommand\letterspaceOff{\directlua{luatexbase.remove_from_callback 
   ( "process_input_buffer" , "letterspace" )}}
   
\AtBeginDocument{\letterspaceOn} 

\begin{document}
The quick brown fox JUMPS ! over the lazy dog.

THE ``“QUICK”, BROWN FOX! JUMPS OVER? THE LAZY``. {\LARGE DOG}.
\end{document}

在此处输入图片描述

相关内容