latex3的基本介绍

目录

如何使用LATEX3

基本语法

参数类型

声明变量

使用变量

声明函数

实例

实例1

实例2

实例3

实例4

 实例5

实例6

实例7

查阅函数文档

宏展开

控制宏展开的意义

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

 方法二:使用\exp_args:函数

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

实例

 实例1

 实例2​​​​​​​​


如何使用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​​​​​​​