命令行输入的定义时扩展

命令行输入的定义时扩展

我正在尝试使以下代码正常工作。我正在使用命令行调用python来检查数字是否在列表中(不知道如何在纯LaTeX中执行此操作(?))。然后我想检查结果是“True”还是“False”。

\documentclass{article}

\newcommand{\mysequence}{[2,3,5,7,11,13,17,19,23,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101]}
\makeatletter
\newcommand\isprime[1]{\@@input|"python -c print((#1)in\mysequence)"}
\makeatother

\newcommand{\compare}[1]{%
\def\test{\isprime{#1}}
\def\true{True}
\def\false{False}

Test: \test\par
\ifx\test\true
#1 is PRIME! :D
\else
#1 is not prime ;(
\fi
\vspace{10pt}
}%

\begin{document}
\compare{3} % 3 is prime
\par
\compare{4} % 4 is not prime
\end{document}

照这样,我得到了正确的值\test,但\ifx比较似乎没有扩展,\@@input所以我得到了错误的结果。输出如下所示:

在此处输入图片描述

我相信我可以通过使用\edef而不是 来解决这个\def问题,但是我尝试让 LaTeX 非常生气,而且它有点超出了我的知识范围而无法修复它。

答案1

如果你真的想要一个通过外部程序解决的解决方案,你可以从中获得灵感egreg 的这个答案然后执行:

\documentclass{article}
\usepackage{etoolbox}
\usepackage{pgffor}

\makeatletter

\newcommand{\mysequence}{%
  [2,3,5,7,11,13,17,19,23,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101]%
}

\newcommand*{\isInList@i}[2]{%
  \begingroup
  \endlinechar=\m@ne\everyeof{\noexpand}%
  \edef\x{\@@input|"python3 -c 'print(#2 in #1)'" }%
  \expandafter
  \endgroup
  \expandafter
  \ifstrequal\expandafter{\x}{True}{%
    #2 is in the list}{%
    #2 is not in the list}.%
}

\newcommand*{\isInList}[1]{%
  \expandafter\isInList@i\expandafter{\mysequence}{#1}%
}

\makeatother

\setlength{\parindent}{0pt}

\begin{document}
\foreach \i in {1,...,23} {%
  \isInList{\i}\par
}
\end{document}

截屏

(我不想在这里说“质数”,因为其中包含的列表\mysequence是有限的;这会导致说,例如, 103 不是质数......)

路人请注意:编译这个需要给LaTeX-shell-escape选项(pdflatex、、等等);否则,它将拒绝运行代码中包含的 shell 命令(此安全措施可确保类、包和文档不会背着你运行任意 shell 命令)。lualatexxelatexpython3 -c '...'

答案2

设置为使用 OP 的语法\mysequence,尽管我认为空格分隔比逗号分隔具有某些优势,但我还是这样做了。

\documentclass{article}
\usepackage{listofitems}
\newcommand{\mysequence}{[2,3,5,7,11,13,17,19,23,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101]}
\newcommand\compare[1]{%
  \setsepchar{,#1,||[#1,||,#1]}%
  \readlist\mylist{\mysequence}%
  \ifnum\listlen\mylist[]>1 #1 is PRIME!\else #1 is not prime\fi
}

\begin{document}

\compare{2}

\compare{3} % 3 is prime

\compare{4} % 4 is not prime

\compare{101}
\end{document}

在此处输入图片描述

补充

为了处理参数也可以是宏的情况(例如,\thepage至少在阿拉伯语中)并且完全扩展为整数,请尝试以下操作:

\documentclass{article}
\usepackage{listofitems}
\newcommand{\mysequence}{[2,3,5,7,11,13,17,19,23,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101]}
\newcommand\compare[1]{\edef\tmp{#1}\expandafter\compareaux\expandafter{\tmp}}
\newcommand\compareaux[1]{%
  \setsepchar{,#1,||[#1,||,#1]}%
  \readlist\mylist{\mysequence}%
  \ifnum\listlen\mylist[]>1 #1 is PRIME!\else #1 is not prime\fi
}

\begin{document}

\compare{2}

\compare{3} % 3 is prime

\compare{4} % 4 is not prime

\compare{101}

\compare{\thepage}
\end{document}

如果不想依赖\edef,而只想将宏限制为单个扩展,则可以定义

\newcommand\compare[1]{\expandafter\compareaux\expandafter{#1}}

相关内容