免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 发帖

列表项的后面能不能加上证明结束的那个符号?

如题,想定义一个 myenumerate,其它的功能和enumerate都一样,就是每个item之后,想加上证明结束的那个符号或者#号,但是当嵌套时,想让内层的item里那个符号的数量也增加。
比如
myenumerate
item 这是外层,结束时有#
  myenumerate
  item 这是内层,结束时有##
这样。
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友

定义 myenumerate 的话想不出来……
只想到另一种方法,定义 \myitem ... ;; 用来代替 \item ,让后面输出 # ,不知能否接受?

TOP

回复 2# kuing

谢谢,这个也行。不过我感觉那些item的话,好像是按enumerate来分层次的,如果单独定义的话,使内层的输出两个#吗?还是得自己手工指定?

TOP

不用手工指定,利用层次深度的内部命令 \@listdepth 来控制输出的个数。
不过……需要在结束的地方用某个东西来标识一下,虽然有点……呃,暂时还没想到别的方法……
这里我用了两个分号,已考虑到输入的方便……
\documentclass{ctexart}

\newcount\tmpct
\makeatletter
\long\def\myitem#1;;{\item#1\nolinebreak\hfill
\tmpct=0%
\loop\ifnum\tmpct<\@listdepth\relax
\#\advance\tmpct by1\relax
\repeat}
\makeatother

\begin{document}
\newcommand\test[1]{这是#1层,这是#1层,这是#1层,这是#1层,这是#1层,这是#1层,这是#1层,这是#1层}
\begin{enumerate}
  \myitem \test 外;;
  \myitem \test 外 \par 开第二段也可以喔;;
  \begin{enumerate}
    \myitem \test 内;;
    \myitem \test 内 \par 开第二段也可以喔;;
    \begin{enumerate}
      \myitem \test{内内};;
      \myitem \test{内内} \par 开第二段也可以喔;;
    \end{enumerate}
  \end{enumerate}
\end{enumerate}
\end{document}
用 XeLaTeX 编译。
$\href{https://kuingggg.github.io/}{\text{About Me}}$

TOP

回复 4# kuing

谢谢,这个的原理,是不是就是判断出当前在第几层,然后把那两个分号换成对应的#数量啊。可这样每个结束都要加一下,觉得还是有点麻烦。
我昨天在网上找到一个这样的:
  1. \newenvironment{myenumerate}
  2.   {%
  3.     \itemize
  4.     \def\aaa{\def\aaa{\ifhmode\unskip\fi\textup{\#}}}
  5.     \pretocmd\item{\aaa}{}{}%
  6.     \pretocmd\enditemize{\ifhmode\unskip\fi.}{}{}%
  7.   }
  8.   {%
  9.     \enditemize
  10.   }

  11. \begin{document}

  12. \begin{myenumerate}
  13.   \item One
  14.   \item Two
  15.   \item Three
  16. \end{myenumerate}
复制代码
里面改动了一部分,\aaa原来的名字太长了,改完就不记得了,效果是一样的。但是原理我还不懂,也没能像序号那样标出来,好像这是因为itemize吧。只是末尾有#,而且最后一个列表项的末尾好像还是单独定义的,想把它们改成一致的。

TOP

回复 5# abababa

\pretocmd 是啥命令,需要什么宏包吗?网上的原文咋样的

TOP

噢,我也找到了,看样子原文是这个帖:https://tex.stackexchange.com/qu ... on-semicolon-period
\pretocmd 是 etoolbox 宏包里的命令,大概意思是给指定的命令前面添加东西。

TOP

我已经大概理解了这个方法的原理,挺巧妙,我也是学到东西了,下面按我的理解讲一讲。

\pretocmd\item{\aaa}{}{} 之后,所有 \item 变成了 \aaa\item ,也就是相当于这样
  1. \begin {itemize}
  2.   \aaa\item One
  3.   \aaa\item Two
  4.   \aaa\item Three
  5. \end {itemize}
复制代码
第 n 行开头的 \aaa 其实就是第 n-1 行的结尾,所以除了最后一条之外,各条之后都有一个 \aaa ,而最后一条的则在 \enditemize 前面加,这样就所有都有了。

但是,那第一行开头 \aaa 岂不是多出来了?这就要说到作者的另一招——定义里再定义:
\def\aaa{\def\aaa{XXX}}
第一次用 \aaa 时,展开为 \def\aaa{XXX}
第二次使用 \aaa 才会是真正需要的 XXX
这样就成功地把第一个多余的 \aaa 给去掉了。

你可以测试一下把定义嵌套 n 次,看是不是需要用 n 次才会出现实际的内容,像这样:
  1. \documentclass{article}
  2. \def\xxx{\def\xxx{\def\xxx{XXX}}}
  3. \begin {document}
  4. 1-\xxx
  5. 2-\xxx
  6. 3-\xxx
  7. \end {document}
复制代码

TOP

然而我发现,这个新建的环境无法嵌套,会报错……看来还有更多的细节需要搞清楚……

TOP

回复 8# kuing

谢谢,看了这个明白那里面的使用方法了。就是7楼的那个帖子,昨天打开了几个,用了之后发现只有这个可能会自动一点。

我想有没有像AtBeginEnvironment{itemize}这样的东西,能让它AtEnd,然后通过前面的判断当前是在第几层,就加入几个符号。

我这帖的原因,是有一些很长的item内容,就像分类讨论那样,然后分类里又要分类,就又有嵌套,虽然前面有数字标号了,但到最后一段时,跟下面的叙述又有些分不开,如果像证明那样有个符号能分开就好了。
如果这个能行,那是不是也能定义出不同层次的字号大小来,或者不同层次加上一个带颜色的横线来区分。但现在最直观的末尾加上井号也没能特别优雅地实现。

TOP

回复 10# abababa

有数字标号,有不同的缩进,通常行距也会大一点,怎么会分不开?

TOP

返回列表 回复 发帖