latex3的基本介绍
目录
方法三:使用\cs_generate_variant:Nn函数
如何使用LATEX3
基本语法
- \usepackage{expl3}
- 启用LATEX3语法:\ExplSyntaxOn
- 关闭LATEX3语法:\ExplSyntaxOffs
- 注意事项:
- 所有空格及换行都会被忽略
- 下划线(_)和冒号(:)等同于英文字母
参数类型
| tl | 凭据表 |
| str | 字符串 |
| int | 整型 |
| fp | 浮点数 |
| seq | 队列 |
| dim | 尺度/长度 |
| bool | 布尔型 |
| N | 接收一个命令,传递命令本身 |
| n | 接收一个凭据表 |
| p | 接收参数列表(#1#2) |
| V | 与N类似,但是传递命令的值 |
| o | 与n类似,但是对凭据表内的内容进行一次展开 |
| x | 与n类似,但是对凭据表的内容进行递归展开 |
| T/F | 与n类似,用于判断语句中,根据判断结果执行T/F代码 |
| c | 接收一个凭据表,返回以其为名字的命令 |
声明变量
使用new结尾的函数
- \bool_new:N
- \int_new:N
- \seq_new:N
- \dim_new:N
- \fp_new:N
使用变量
使用use结尾的函数
- \bool_use:N
- \int_use:N
- \seq_use:N
- \dim_use:N
- \fp_use:N
声明函数
使用\cs_set:Npn来声明函数
\documentclass{article}
\usepackage{ctex}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\cs_set:Npn \my_function:n #1{
你输了: #1
}
\par\my_function:n {一}
\par\my_function:n {二}
\ExplSyntaxOff
\end{document}

实例
实例1
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
%LaTex3 代码
\ExplSyntaxOff
\end{document}
实例2
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\int_new:N \l_my_tmpa_int
\int_new:N \l_my_tmpb_int
\int_set:Nn \l_my_tmpa_int {200}
\int_set:Nn \l_my_tmpb_int {10}
\int_eval:n {\l_my_tmpa_int+\l_my_tmpb_int}
\ExplSyntaxOff
\end{document}
实例3
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\int_step_inline:nn {20}{
#1,\quad
}
\ExplSyntaxOff
\end{document}
实例4
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\int_step_inline:nnn {10}{20}{
#1,\quad
}
\ExplSyntaxOff
\end{document}
实例5
计算1+2+3+...+100=?
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\int_set:Nn \l_tmpa_int {0}
\int_step_inline:nn {100}{
\int_add:Nn \l_tmpa_int{#1}
}
\int_use:N \l_tmpa_int
\ExplSyntaxOff
\end{document}
或者
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\int_set:Nn \l_tmpa_int{1}
\int_set:Nn \l_tmpb_int{0}
\int_do_while:nNnn {\l_tmpa_int}<{101}{
\int_add:Nn \l_tmpb_int {\l_tmpa_int}
\int_incr:N \l_tmpa_int
}
\int_use:N \l_tmpb_int
\ExplSyntaxOff
\end{document}
诸如\int_do_until:nNnn, \bool_do_until:nn 等语句每一次循环就进行一次判断,直到判断为真。
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\int_set:Nn \l_tmpa_int {1}
\int_set:Nn \l_tmpb_int {0}
\int_do_until:nNnn {\l_tmpa_int}>{100}{
\int_add:Nn \l_tmpb_int {\l_tmpa_int}
\int_incr:N \l_tmpa_int
}
\ExplSyntaxOff
\end{document}
实例6
外层循环#1,内层循环##1
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\cs_set:Npn \my_factorial:n #1 {
\int_set:Nn \l_tmpa_int {1}
\seq_clear:N \l_tmpa_seq
\int_step_inline:nn {#1}{
\seq_put_right:Nn \l_tmpa_seq {##1}
\int_set:Nn \l_tmpa_int {\l_tmpa_int * ##1}
}
$\seq_use:Nn \l_tmpa_seq {\times}=\int_use:N \l_tmpa_int$
}
\par\my_factorial:n {3}
\par\my_factorial:n {7}
\ExplSyntaxOff
\end{document}

实例7
\documentclass{article}
\usepackage{expl3}
\usepackage{tikz}
\begin{document}
\ExplSyntaxOn
\begin{tikzpicture}
\int_step_inline:nnn {0}{17}{
\fp_set:Nn \l_tmpa_fp {20*(#1)*\c_one_degree_fp}
\node[minimum~width=1.5mm, fill=blue, draw=none,circle,inner~sep=0pt]
at (\fp_eval:n {cos(\l_tmpa_fp)}, \fp_eval:n {sin(\l_tmpa_fp)}){};
}
\end{tikzpicture}
\ExplSyntaxOff
\end{document}
查阅函数文档
https://mirrors.dgut.edu.cn/CTAN/macros/latex/contrib/l3kernel/interface3.pdf
宏展开
控制宏展开的意义


方法一:选择正确的函数变体


方法二:使用\exp_args:函数





方法三:使用\cs_generate_variant:Nn函数



实例
实例1









实例2





