当原始字符串包含 % 字符时,使用 \directlua 获取子字符串

当原始字符串包含 % 字符时,使用 \directlua 获取子字符串

我想在 LaTeX 中实现一种具有两个参数的函数

  • 包含百分比的字符串,例如“3.20%”
  • 一个整数,例如 2000 结果应该是两个数字的乘积(在本例中为 3.20)

我尝试使用 \directlua 命令来实现这一点,但我没有掌握处理包含特殊字符“%”的字符串的技巧。

我尝试过类似的事情:

\documentclass[11pt,a4paper]{article}


\begin{document}
% I produce the LaTeX document such that the arguments to the calculation get filled in
% directly into the xxx.tex file. Yes I could fill in the value without 

Input arguments are
\begin{itemize}
   \item percentage: 3.20 \%
   \item factor: 2000
\end{itemize}

The result is: \directlua{
        s=string.sub('3.20 \%', 1, -3) 
        tex.sprint( s / 100 * 2000)
    }.
\end{document}

答案1

除了使用原始指令外,\luadirect您还可以使用\luaexeclua代码包,即可完成工作。换句话说,一旦luacode加载了包,您需要做的就是\directlua{s=string.sub('3.20 \%', 1, -3)...用替换\luaexec{s=string.sub('3.20 \%', 1, -3)...

在此处输入图片描述

\documentclass[11pt,a4paper]{article}
\usepackage{luacode} % for \luaexec macro

\begin{document}
Input arguments are
\begin{itemize}
   \item percentage: 3.20 \%
   \item factor: 2000
\end{itemize}

The result is: 
\luaexec{%
   s=string.sub('3.20 \%', 1, -3) 
   tex.sprint( s * 2000 / 100 )
}.
\end{document}

答案2

您可以使用\@percentchar

\documentclass[fontsize=11pt, paper=a4]{article}

\makeatletter
\let\pc\@percentchar
\makeatother

\begin{document}
% I produce the LaTeX document such that the arguments to the calculation get filled in
% directly into the xxx.tex file. Yes I could fill in the value without 

Input arguments are
\begin{itemize}
   \item percentage: 3.20 \%
   \item factor: 2000
\end{itemize}

The result is: \directlua{s=string.sub('3.20 \pc', 1, -3) tex.sprint( s / 100 * 2000)}.
\end{document}

答案3

专家用户似乎更喜欢使用\directlua。如果你不太了解 TeX 中类别代码的概念,我建议使用luacode*环境以避免意外。

%! TEX program = lualatex

\documentclass{article}

\usepackage{luacode}

\begin{document}
% I produce the LaTeX document such that the arguments to the calculation get filled in
% directly into the xxx.tex file. Yes I could fill in the value without 

Input arguments are
\begin{itemize}
   \item percentage: 3.20 \%
   \item factor: 2000
\end{itemize}

The result is:
\begin{luacode*}
s=string.sub('3.20 \\%', 1, -3)
tex.sprint( s / 100 * 2000)
\end{luacode*}
.
\end{document}

另一种方法是

The result is: \luaexec{ s=string.sub('3.20 \\\%', 1, -3) tex.sprint( s / 100 * 2000) }.

有关详细信息,请参阅包的文档luacode

另一种选择是(由于有意外,不推荐)

The result is: \directlua{ s=string.sub([[3.20 \%]], 1, -3) tex.sprint( s / 100 * 2000) }.

这将直接传递[[3.20 \%]]给 Lua,这是有效的 Lua 代码,因为\内部[[ ... ]]没有被处理。

答案4

可以使用\directlua:\luastring来创造奇迹。也许有人能很好地解释为什么这样做有效。欢迎大家评论为什么这样做有效以及这种方法的优缺点。

\documentclass[11pt,a4paper]{article}

\usepackage{luacode} % for the use of \luastring

\begin{document}

Input arguments are
\begin{itemize}
    \item percentage: 3.20 \%
    \item factor: 2000
\end{itemize}

The result is: \directlua{
    s=\luastring{3.20 \%}
    s = string.sub(s, 1, -3)
    tex.sprint( s / 100 * 2000)}.
\end{document}

相关内容