変数の内容を新しいコマンド内で逐語的な表現に変換します(オプションの引数として使用します)。

変数の内容を新しいコマンド内で逐語的な表現に変換します(オプションの引数として使用します)。

私はこれを解決するために 8 時間を費やし、ある程度の進歩はしましたが、今度は LaTeX の逐語的な内容に関する大きな困難に直面しています。どんな助けでも大歓迎です!

私の目標は、todonotesパッケージがインライン オプションを提供していることですが、 を使用したい場合には\listoftodos、方程式環境などのより複雑なインライン要素はキャプション引数に適していないため、これが機能しなくなります。簡単な解決策は、fix のオプションのキャプション引数\todoを のようなものに設定することです\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

逐語的な解決策を試みるのではなく、ここでは、tokcycleToDo ノートの入力を循環的に処理して適切なキャプションを生成します。ToDo リストのキャプションを生成する処理には、次のものが含まれます。

  1. cat 10、11、12トークンはキャプションに反映されます

  2. ブレースは{}cat-12に変換されます[]

  3. マクロ名は\stringで始まりますが、 は\に置き換えられます。マクロ名の長さに関係なく、/マクロは、許可された に対して 1 つのトークンとしてのみカウントされます。trunclim

  4. 0、1、2、10、11、12 以外の catcode は無視されます。

  5. 合計数トークン\thetrunclim - 1マクロ名がこのカウントでは単一のトークンとしてのみカウントされることを考慮して、to-do リストのキャプションの は を超えることはありません。

  6. 次の MWE では、trunclimが に設定されています20

MWE:

\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}

ここに画像の説明を入力してください

を 40 に設定するとtrunclim、結果は次のようになります。

ここに画像の説明を入力してください

関連情報