将变量内容转换为新命令中的逐字表示(然后用作可选参数)

将变量内容转换为新命令中的逐字表示(然后用作可选参数)

我花了 8 个小时来解决这个问题,取得了一些进展,但现在面临着乳胶中逐字记录的巨大困难。任何帮助都非常感谢!

我的目标:该todonotes包提供了一个内联选项,但是如果要使用,该选项就会中断\listoftodos,因为更复杂的内联内容(如方程式环境)在某种程度上不适合 caption 参数。一个简单的解决方案是将\todofix 的可选 caption 参数设置为类似\todo[inline,caption={inline...}]{...}。更难但更好的解决方案是,例如,删除内联注释的前 20 个字符并将其放入标题中。这是我尝试过的,并且有效几乎

具体来说,只要剪切后的版本不包含特殊字符,它就已经可以正常工作了。在下面的代码中,您可以找到%%%%%%%标记决定性位置。\StrLeft{\myraw}{10}可以正常工作,但\StrLeft{\myraw}{20}已经中断。

此外,我还进行了一些其他尝试,如何使此内容逐字逐句。它们在外面有效,但在里面无效。我也从中\newcommand了解到,但是在这里我也找不到实现我想要的东西的方法。\NewDocumentCommand{\myverb}{+v}{\texttt{#1}}xparse

期待您的帮助。

\documentclass{article}

\usepackage{xstring}
\usepackage{amsmath}
\usepackage{comment}
\usepackage{todonotes}
\usepackage{verbdef}


% TODO this still does not work for special sequences! kind of escape inbetween?
\newcommand{\MYTODO}[2][]{%
% makes a raw approximation and cut - this must be called within the same newcommand and cannot be outsourced for some reason I do not fully understand:
\scancs[0]\myraw{#2}
%equivalent to:
%\StrExpand[0]{#2}{\h}
%\def\raw{\detokenize\expandafter{\h}}
\StrLeft{\myraw}{10}[\myleft]  %%%%%%% changing this number to for example 20 breaks the code %%%%%%%
%
% this is the essential thing we want:
%\expandafter\verbdef\expandafter\variable\expandafter+\myleft+    %%%breaks immedidiately
%\todo[inline, caption={\string\myleft}, #1]{#2}   %%%breaks immediately
%\todo[inline, caption={\texttt{\myleft}}, #1]{#2}  %%%breaks also for surroundings
\todo[inline, caption={\myleft}, #1]{#2}
}


\begin{document}
\listoftodos
\bigskip

\MYTODO[author=me]{ABCDEF}

\MYTODO{%
but what if
\begin{align*}
    x^2
\end{align*}
}


\bigskip
%I tested here some ways to get verbatime output inside a variable, but both do not work in commands
\def\toverb{this works|, but only outside a newcommand.}
\expandafter\verb\expandafter+\toverb+
\expandafter\verbdef\expandafter\fromverb\expandafter+\toverb+
\fromverb

\end{document}

\StrLeft{\raw}{10} 代码的输出

答案1

我在这里没有尝试逐字逐句地解决问题,而是tokcycle循环浏览您的待办事项注释输入并对其进行处理以生成合适的标题。生成待办事项列表标题的处理包括:

  1. 第 10、11 和 12 类标记被回显到标题中

  2. 支撑{}转变为 cat-12[]

  3. 宏名称已\string编辑,但\被 替换为。无论宏名称有多长,/宏仅计为允许的 1 个标记。trunclim

  4. 除 0、1、2、10、11、12 之外的 Catcode 将被忽略。

  5. 总人数代币在待办事项列表的标题中不会超过\thetrunclim - 1,因为宏名称在此计数中仅算作一个标记。

  6. 在下面的 MWE 中,trunclim设置为20

妇女权利委员会:

\documentclass{article}
\usepackage{amsmath}
\usepackage{comment}
\usepackage{todonotes}
\usepackage{tokcycle}
\newcounter{trunclength}
\def\trunclim{20}
\makeatletter
\newcommand\myleft[1]{%
  \setcounter{trunclength}{0}%
  \tokcycle
  {\stepcounter{trunclength}%
   \tctestifnum{\thetrunclength<\trunclim}{%
     \tctestifcatnx A##1{\addcytoks{##1}}{%
     \tctestifcatnx 0##1{\addcytoks{##1}}{%
     }}%
   }{}}%
  {\processtoks{[##1]}}%
  {\stepcounter{trunclength}%
    \tctestifnum{\thetrunclength<\trunclim}{%
    \addcytoks{/}%
    \addcytoks[2]{\expandafter\@gobble\string##1}}{}}%
  {\stepcounter{trunclength}%
    \tctestifnum{\thetrunclength<\trunclim}{\addcytoks{##1}}{}}%
  {#1}%
}
\makeatother
% TODO this still does not work for special sequences! kind of escape inbetween?
\newcommand{\MYTODO}[2][]{%
  \myleft{#2}\todo[inline, caption={\the\cytoks}, #1]{#2}
}
\begin{document}
\listoftodos
\bigskip
\MYTODO[author=me]{ABCDEF}
\MYTODO{%
but what if
\begin{align*}
    x^2
\end{align*}
}
\end{document}

在此处输入图片描述

如果trunclim设置为 40,结果如下:

在此处输入图片描述

相关内容