我正在尝试使以下代码正常工作。我正在使用命令行调用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 命令)。lualatex
xelatex
python3 -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}}