使用 LuaLaTeX 解决方案调整文档中的间距,我遇到了一个问题,在 TikZ 环境中分号也会被替换:
梅威瑟:
\documentclass{scrbook}
\usepackage{tikz}
\usepackage{luacode}
\usepackage{etoolbox}
\newrobustcmd\dblpnct[1]{%
\ifincsname\else
\ifmmode\else
\ifhmode
\unskip
\fi
\nolinebreak\hspace{#1}%
\fi
\fi
}
\begin{luacode}
function dosub(s)
s = string.gsub(s, ';', '\\dblpnct{1.08334em}:')
return(s)
end
\end{luacode}
\makeatletter
\AtBeginDocument{%
\luaexec{luatexbase.add_to_callback("process_input_buffer", dosub, "dosub")}%
\ifpatchable*\NR@sanitize@labelname
{\pretocmd\NR@sanitize@labelname{\let\dblpnct\@gobble}{}{\failed}}
{}
}
\makeatother
\begin{document}
\begin{tikzpicture}
\node{test};
\end{tikzpicture}
\end{document}
答案1
问题在于所选方法的局限性。在处理输入缓冲区时,分号的上下文和含义不可用。例如,一行可能看起来像:
\tikz\node{abc; def};
第一个分号属于排版文本,但第二个分号用作语法字符。也许,一些很小的子集情况可以通过正则表达式捕获,但 TeX 的语言太强大(图灵完备),无法捕获所有情况。
一种解决方法是使用不同于语法分号的东西并将其替换为 Lua 函数中的分号,例如(示例的基础是问题的示例,但用分号代替冒号)。
句法分号写为SEMICOLON
。经过处理后dosub
变为;
:
\documentclass{scrbook}
\usepackage{tikz}
\usepackage{luacode}
\usepackage{etoolbox}
\newrobustcmd\dblpnct[1]{%
\ifincsname\else
\ifmmode\else
\ifhmode
\unskip
\fi
\nolinebreak\hspace{#1}%
\fi
\fi
}
\begin{luacode}
function dosub(s)
s = string.gsub(s, ';', '\\dblpnct{1.08334em};')
s = string.gsub(s, 'SEMICOLON', ';')
return(s)
end
\end{luacode}
\makeatletter
\AtBeginDocument{%
\luaexec{luatexbase.add_to_callback("process_input_buffer", dosub, "dosub")}
\ifpatchable*\NR@sanitize@labelname
{\pretocmd\NR@sanitize@labelname{\let\dblpnct\@gobble}{}{\failed}}
{}
}
\makeatother
\begin{document}
\begin{tikzpicture}
\node{test}SEMICOLON
\end{tikzpicture}
\end{document}