使用 expl3 + input引用文件 时出现多余的字符

发布于 2022-07-18 08:35:51

一个小文档,原本是这样写的:

\input{daily/00001.tex}
\input{daily/00002.tex}
\input{daily/00003.tex}

由于 \input 所引用的文件有规律,并且会逐渐增加,为了避免每次都添加一个 \input 语句,所以想将其修改成循环的方式,让它自动判断有那些文件。

修改后的代码如下:

\ExplSyntaxOn
\int_step_inline:nnnn {1} {1} {3}
{
    \int_case:nnTF {\str_count:N {#1}}
    {
        {1} { \str_set:Nn \l_filename_str {daily/0000#1.tex}}
        {2} { \str_set:Nn \l_filename_str {daily/000#1.tex}}
        {3} { \str_set:Nn \l_filename_str {daily/00#1.tex}}
        {4} { \str_set:Nn \l_filename_str {daily/0#1.tex}}
        {5} { \str_set:Nn \l_filename_str {daily/#1.tex}}
    }{}{}

    \file_if_exist:nTF {\l_filename_str} {
        \include {\l_filename_str}
    } {
    }
}
\ExplSyntaxOff

不过修改后的生成的文档中,会在右侧出现一些字母(不知道从那里来的。)

问题:

  1. 如何去掉这些多余的字母?
  2. 生成文件名 \l_filename_str 的代码能否简化。

多余的字母.png


无法上传附件,就将代码贴在这里。
fer-memory.tex

\documentclass[UTF8,12pt]{ctexart}
\usepackage{fontspec} % 使用 fontspec 包
\setmainfont{Arial}   % 设置一种包括 IPA 字符的字体,这里选Windows自带的 Arial
\usepackage{array}
\usepackage{geometry}
\geometry{a4paper,left=2cm,right=2cm,top=2cm,bottom=2cm}

\begin{document}


\ExplSyntaxOn
\int_step_inline:nnnn {1} {1} {3}
{
    \int_case:nnTF {\str_count:N {#1}}
    {
        {1} { \str_set:Nn \l_filename_str {daily/0000#1.tex}}
        {2} { \str_set:Nn \l_filename_str {daily/000#1.tex}}
        {3} { \str_set:Nn \l_filename_str {daily/00#1.tex}}
        {4} { \str_set:Nn \l_filename_str {daily/0#1.tex}}
        {5} { \str_set:Nn \l_filename_str {daily/#1.tex}}
    }{}{}

    \file_if_exist:nTF {\l_filename_str} {
        \include {\l_filename_str}
    } {
    }
}
\ExplSyntaxOff

\input{daily/00001.tex}

\end{document}

daily/00001.tex

% 00010.json
\renewcommand\arraystretch{1.5}
\begin{tabular}{w{l}{3cm} w{l}{4cm} w{l}{2cm} w{l}{7cm}}

    wake & /weɪk/ & vi. \& vt. & 醒,醒来;唤醒 \\
    shall & /ʃəl; strong ʃæl/ & modal v. & (表示提出或征求建议) \\
    hill & /hɪl/ & n. & 小山 \\
    seldom & /ˈseldəm/ & adv. & 很少,不常 \\
    out & /aʊt/ & adv. & (从……里)出来,向外,外出 \\
    need & /niːd/ & vt. & 需要 \\
    rest & /rest/ & n. & 休息,歇息 \\
    just & /dʒəst; strong dʒʌst/ & adv. & 只是 \\
    after-school & /ˈɑːftə skuːl/ & adj. & 课外的,课后的 \\
    country & /ˈkʌntri/ &  & 国家 \\
    will & /wɪl/ &  & 将,将要 \\
    learn & /lɜːn/ &  & 学习 \\
    Australia & /ɒˈstreɪliə/ &  & 澳大利亚 \\
    magazine & /ˌmæɡəˈziːn/ &  & 杂志 \\
    kangaroo & /ˌkæŋɡəˈruː/ &  & 袋鼠 \\
    koala & /kəʊˈɑːlə/ &  & 考拉 \\

\end{tabular}

\renewcommand\arraystretch{1.5}
\begin{tabular}{w{l}{5cm} w{l}{10cm}}

    get up & 起床 \\
    reading room & 阅览室 \\
    all kinds of & 各种各样的 \\
    borrow ... from ... & 向……借…… \\
    far away from & 远离 \\
    on foot & 走路,步行 \\
    all the best & 一切顺利,万事如意 \\

\end{tabular}

\newpage

查看更多

关注者
0
被浏览
937
Beatrice
Beatrice 2022-07-18
这家伙很懒,什么也没写!

daily/00001.tex两个表格之间加\par就好了。

3 个回答
逆天小白兔
逆天小白兔 2022-07-18
这家伙很懒,什么也没写!

定义成函数在\ExplSyntaxOn \ExplSyntaxOff 外插入即可

\ExplSyntaxOn \ExplSyntaxOff 环境里的空格和换行都不起作用的



\documentclass[UTF8,12pt]{ctexart}
\usepackage{fontspec} % 使用 fontspec 包
\setmainfont{Arial}   % 设置一种包括 IPA 字符的字体,这里选Windows自带的 Arial
\usepackage{array}
\usepackage{geometry}
\geometry{a4paper,left=2cm,right=2cm,top=2cm,bottom=2cm}

\begin{document}


\ExplSyntaxOn
\NewDocumentCommand\inputfiles{}{
\int_step_inline:nnnn {1} {1} {3}
{
    \int_case:nnTF {\str_count:N {##1}}
    {
        {1} { \str_set:Nn \l_filename_str {0000##1.tex}}
        {2} { \str_set:Nn \l_filename_str {000##1.tex}}
        {3} { \str_set:Nn \l_filename_str {00##1.tex}}
        {4} { \str_set:Nn \l_filename_str {0##1.tex}}
        {5} { \str_set:Nn \l_filename_str {##1.tex}}
    }{}{}

    \file_if_exist:nTF {\l_filename_str} {
        \include {\l_filename_str}
    } {
    }
}
}
\ExplSyntaxOff

\inputfiles

% \input{00001.tex}

\end{document}
五行真人
五行真人 2022-07-18
这家伙很懒,什么也没写!

上午没仔细分析,因为你的 00001.tex 的路径和我的不一样,导致没有出现正确的结果。
刚才又按照你的思路修改了一下,修改后的代码如下:

\ExplSyntaxOn
\NewDocumentCommand\inputfiles{}{
    \int_step_inline:nnnn {1} {1} {99999}
    {
        \int_case:nnTF {\str_count:N {##1}}
        {
            {1} { \str_set:Nn \l_filename_str {daily/0000##1.tex}}
            {2} { \str_set:Nn \l_filename_str {daily/000##1.tex}}
            {3} { \str_set:Nn \l_filename_str {daily/00##1.tex}}
            {4} { \str_set:Nn \l_filename_str {daily/0##1.tex}}
            {5} { \str_set:Nn \l_filename_str {daily/##1.tex}}
        }{}{}

        \file_if_exist:nTF {\l_filename_str} {
            \include {\l_filename_str}
        } {
            \prg_break:
        }
    }
}
\ExplSyntaxOff

\inputfiles

这一解决办法从 Latex3 的特性入手,属于治本,
而单纯加 \par 的办法,仅适用于我的表格布局,换成其它内容就又不行了,属于治标。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览