理想的效果是这样:
理想情况的描述:
\parnote{#1}{#2}
,其中#1
是古文中需要解释的词语,就像示例图中的“广陵”,而这个命令会把“广陵”这两个字加上红色后直接排版,其次,#2
表示对#1
的解释说明,就像示例图中的“今江苏扬州西北”。总的说来,“注释”这一段的内容,我希望它是通过在“原文”这个段落中使用\parnote{#1}{#2}
这个命令自动得到。图床/或者说文件床最近挂了...你的mwe我打不开....
尝试了一下:
\documentclass{ctexart}
\usepackage{xcolor}
\usepackage[b5paper,landscape,showframe]{geometry}
\usepackage{needspace}
\usepackage{zhlipsum}
\usepackage{circledtext}
\ExplSyntaxOn
\clist_new:N \g_my_parnote_clist
\clist_new:N \g_my_parnotetxt_clist
\makeatletter
\newcounter{parnotecnt}
\NewDocumentCommand{\parnote}{O{red} m m}{%
\refstepcounter{parnotecnt}
\unskip\textcolor{#1}{#2}\hbox{\@textsuperscript{\normalfont\circledtext[charf=\small]{\arabic{parnotecnt}}}}\unskip
\clist_gput_right:Nn \g_my_parnote_clist {#2}
\clist_gput_right:Nn \g_my_parnotetxt_clist {#3}
}
\makeatother
\NewDocumentEnvironment{myenv}{+b}{%
\setcounter{parnotecnt}{0}%
\clist_clear:N \g_my_parnote_clist
\clist_clear:N \g_my_parnotetxt_clist
\needspace{\baselineskip}{\bfseries~【原文】}\par
{#1} \par%\vspace{5pt}
% \clist_use:Nn \g_my_parnote_clist {,}
\clist_if_empty:NF {\g_my_parnote_clist}{%
\needspace{.8\baselineskip}{\bfseries~【注释】}\par
\int_step_inline:nn {\clist_count:N \g_my_parnote_clist}{%
\noindent{##1}.~\clist_item:Nn \g_my_parnote_clist {##1}:~\clist_item:Nn \g_my_parnotetxt_clist {##1}~\par
}
}\vspace{2cm}%
}{}
\ExplSyntaxOff
\begin{document}
\begin{myenv}%
\zhlipsum[2]
测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本
\end{myenv}
\begin{myenv}%
\zhlipsum[2]
测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本测试文本\parnote{红色注释}{注释内容}测试文本\parnote[cyan]{蓝色注释}{注释内容}测试文本
\zhlipsum
\end{myenv}
\begin{myenv}
如果文段中没有\texttt{parnote},则不会输出【注释】\par
\zhlipsum[2]
\end{myenv}
\end{document}
不太确定还有没有什么bug...
好厉害!虽然我啥也看不懂。。。
@u101077 其实没什么技术含量的,翻译成
python
大概就是类似的入门代码:只是因为
expl3
的syntax
比较长看起来比较复杂@u70550 要是您用
TeX
的知识解释下我还能勉强理解,用python
我是一点也不明白啊。。。@u70550 注释这个段落中能否让序号页采取带圈形式?以及能否把圈圈单独亮出来(也就是悬挂,像原先我使用的
enumerate
环境那样),让别人方便检索?以及在这种极端情况下,比如连续挨着的几个词语需要注释,会得到不正确的换行,产生一个超长的水平溢出盒子,而用
\linebreak
强行打断的话,又会得到更多不正确的溢出@u101077 就像这个鬼样子:
@u101077 关于悬挂以及替换为带圈数字的问题,可以做如下修改:
只是把
##1
替换为\circledtext[charf=\small]{##1}
.@u101077 关于您提到的“鬼样子”,我不太觉得这是我的问题,我会新开一个问题。这个“鬼样子”的问题在这里应该也是存在的。
上面代码中的
\unskip
正是为了吞掉这个空格。Editted 20250210(MayBe the final version):
@u101077 感谢这个链接,注意下面的空格只能在
XeLaTeX
下使用,在LuaLaTeX
下空格处理效果有所不同。