我在这里描述下需求,可能会有些许描述不清的地方,请多多担待。
我的模板中定义了两种带图片的标题样式,分别为part和chapter,且都必须区分奇偶数页,也就是偶数页需要方向为左的图片,奇数页则为方向向右的图片。我的需求是,设计一种latex3程序,可以提供一个命令来输入两组不同方向图片名称的字符串,用英文逗号间隔,其中方向向左的分为一组,向右的也分为一组,类似于
\titleimage{
chapterevenimage={<方向向左的图片分组>},
chapteroddimage={<方向向右的图片分组>},
partevenimage={<方向向左的图片分组>},
partoddimage={<方向向右的图片分组>},
}
然后自动判别奇偶数页,并根据奇数页向右和偶数页向左的规则来自动按顺序循环插入图片,即若我们的输入为\chapterevenimage={a,b,c}
,则第一个偶数页章为其分配a,然后第二个偶数页章为b,第三个偶数页章为c,到了第四个偶数页章又回到a,……,就这样依次循环。
上面就是我想要的效果,小生实在不会弄,所以还是厚着脸皮求求各位了,不胜感激!
代码见: 123云盘 提取码:ivYS
把图片名分别保存到 seq 里即可。
\seq_new:N \g__my_chapter_oimage_seq % odd
\seq_new:N \g__my_chapter_eimage_seq % even
\seq_new:N \g__my_part_oimage_seq % odd
\seq_new:N \g__my_part_eimage_seq % even
\keys_define:nn { my/titleimage }
{
chapteroddimage .code:n =
\seq_gset_from_clist:Nn \g__my_chapter_oimage_seq {#1} ,
chapterevenimage .code:n =
\seq_gset_from_clist:Nn \g__my_chapter_eimage_seq {#1} ,
partoddimage .code:n =
\seq_gset_from_clist:Nn \g__my_part_oimage_seq {#1} ,
partevenimage .code:n =
\seq_gset_from_clist:Nn \g__my_part_eimage_seq {#1} ,
}
\cs_new:Npn \__my_title_image:Nn #1#2 % image seq, number
{ \seq_item:Nn #1 { \int_mod:nn {#2} { \seq_count:N #1 } + 1 } }
\cs_new:Npn \my@chapterimagename
{
\int_if_odd:nTF { \value{page} }
{ \__my_title_image:Nn \g__my_chapter_oimage_seq { \value{chapter} } }
{ \__my_title_image:Nn \g__my_chapter_eimage_seq { \value{chapter} } }
}
\cs_new:Npn \my@partimagename
{
\int_if_odd:nTF { \value{page} }
{ \__my_title_image:Nn \g__my_part_oimage_seq { \value{part} } }
{ \__my_title_image:Nn \g__my_part_eimage_seq { \value{part} } }
}
\cs_new_protected:Npn \titleimage #1
{ \keys_set:nn { my/titleimage } {#1} }
使用时
\titleimage{
chapteroddimage={inner_pics/songodd, inner_pics/yinghuaodd},
chapterevenimage={inner_pics/songeven, inner_pics/yinghuaeven},
...
}
\includegraphics{\my@chapterimagename} % 会自动改变
\includegraphics{\my@partimagename} % 会自动改变
放到文档类中时,不要用 my
作为模块名,改成你自己的名字。
老师您好。这个有点小问题,就是我不想让它按章节数来输出图片,而是想要它按照我给出的图片顺序,不管第几章,就是只要该章在奇数页,取一次奇数页的图片,下一次章又出现在奇数页就取奇数页图片组中该图片后一个图片,依次取,最后没有的选了就循环回到第一张图片,奇数页和偶数页各有一组图片组来循环,二不管章节号是多少的。而您给的代码是依照章节号分配图片,这太奇怪了,你能修改下吗?
老师,这里给个例子说明下,假如给出的图片组为
则无论章节编号如何改变,假设前面累计了n次oddimage使用和m次evenimage使用,那么现在,如果新的一章出现在奇数页,那么为其分配第n+1个oddimage,否则为其分配第m+1个evenimage.
就是说需要两个计数器分别记录oddimage和evenimage的使用次数,并在每次使用后+1,然后利用这两个计数器的值作为下一次判断完奇偶页后章的图片选取,就像上面,设n和m分别代表当前oddimage和evenimage的使用次数,那么下一章的图片选取就是从第n+1个oddimage或者第m+1个evenimage中选取,值得注意的是,如果n或m的值超出了所提供的图片组个数时,比如设我们分别有a和b张oddimage和evenimage,但是n+1>a或m+1>b,那么取a整除n+1后的余数第s张oddimage,偶数页同理
是(n+1)/a=t……s,上面说错了,抱歉,就是只需要这两个计数器以及一个余数计算就可以了,不知是否可行?
@u45041 看看是不是这样:
\..get..
会全局保存当前的图片名称到它的第一个参数里。@u10307 不要过早地使用
\..get..
,否则可能无法准确判断奇偶页。老师,这个应该怎么放置啊?
我把latex3代码放在了chapter自定义代码前面,然后下面的代码放在了frontmatter前面,结果图片全都一个样了?
@u45041 每次要更改图片时都要使用
\..get..
来更新图片名称。好的,谢谢老师了!