
을(를) 사용하는 것과 관련하여 또 다른 질문이 있습니다 expl3
. 임의의 포물선을 생성한 다음 생성된 방정식을 다시 작성한 형식으로 인쇄하려고 합니다. 이름 \NewDocumentCommand
이 \parabola
. 표준 형태의 이차식의 다양한 계수에 해당하는 몇 가지 전역 변수가 선언되어 있습니다. 즉, (A/D)(xh)^2+k로 주어진 이차방정식의 표준 형식에 대한 것입니다. A는 [-2,2]\{0}의 정수이고, D는 [1,5]의 정수이고, h와 k는 [-2,2]의 정수입니다. 게다가 제가 플로팅에 사용하는 표준 형식을 취하고 이를 확장된 형식(예: ax^2+bx+c)으로 작성하는 섹션을 원합니다. 이 부분은 확실히 달성하는데 실패했습니다. 내 서문이 제공되고 문서는 다음과 같습니다.
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[margin=0.75in]{geometry}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{amsmath,amssymb,enumitem}
\usepackage[first=-20, last=20]{lcg}
\usepackage{tikz}
\usepackage{tkz-euclide}
\usepackage{calculator}
\usepackage{calculus}
\usepackage{ifthen}
\usepackage{xfp}
\usepackage{pgffor}
\usepackage{pgfplots}
\newcommand{\randi}{\rand\arabic{rand}}
\ExplSyntaxOn\newcommand{\intR}[2]{\chgrand[first=#1, last=#2] \randi}\ExplSyntaxOff
\ExplSyntaxOn\newcommand{\firstpower}{\chgrand[first=2, last=5] \randi}\ExplSyntaxOff
\ExplSyntaxOn\def\isneg#1{
\expandafter\ifnum#1>0 ~+\else ~-\fi
}\ExplSyntaxOff
\ExplSyntaxOn\def\isopp#1{
\expandafter\ifnum#1>0 ~-\else ~+\fi
}\ExplSyntaxOff
\ExplSyntaxOn\def\isone#1{
\expandafter\ifnum#1=1 ~1\else ~2\fi
}\ExplSyntaxOff
\newcommand{\addsub}{\pgfmathrandomitem{\choice}{choices1}\choice}
\pgfmathdeclarerandomlist{choices1}{{+}{-}}
\newcommand{\subnone}{\pgfmathrandomitem{\choice}{choices3}\choice}
\pgfmathdeclarerandomlist{choices3}{{}{-}}
\pgfplotsset{ every non boxed x axis/.append style={x axis line style=-}, every non boxed y axis/.append style={y axis line style=-}}
\NewDocumentCommand{\parabola}{}{
\int_gset:Nn \g_point_num_int { \int_rand:nn { -2 } { 2 } }
\int_gset:Nn \g_point_denom_int { \int_rand:nn { 1 } { 5 } }
\int_gset:Nn \g_point_xv_int { \int_rand:nn { -2 } { 2 } }
\int_gset:Nn \g_point_yv_int { \int_rand:nn { -2 } { 2 } }
\begin{tikzpicture}
\begin{axis}[
width=0.7\textwidth,
height=0.7\textwidth,
grid=major,
xmin=-5,
xmax=5,
ymin=-5,
ymax=5,
axis~lines=center
% axis lines = left
]
\addplot[smooth, red, thick] {(\g_point_num_int / \g_point_denom_int)*(x-\g_point_xv_int)^2+\g_point_yv_int};
\end{axis}
\end{tikzpicture}
}
\int_new:N \l_val_An_int
\int_new:N \l_val_Bn_int
\int_new:N \l_val_Cn_int
\int_new:N \l_val_Ad_int
\int_new:N \l_val_Bd_int
\int_new:N \l_val_Cd_int
\NewDocumentCommand{\paraexpand}{}{
% Writing expression for the A coefficient
\MULTIPLY{ \int_gset:N \g_point_num_int }{ 1 }{\tempNum}~
\MULTIPLY{ \int_gset:N \g_point_denom_int }{ 1 }{\tempDenom}~
\FRACTIONSIMPLIFY{ \tempNum }{ \tempDenom }{\An}{\Ad}
\ABSVALUE{ \An }\absAn~
\int_if_odd:nTF \isone{\Ad} {
\int_if_odd:nTF \isone{\absAn} {} {\int_set:Nn \l_val_A_int {\absAn} } } { \FRACTIONSIMPLIFY{\absAn}{\Ab}{}{} }
% Writing expression for numerator of B coefficient
\MULTIPLY{ \int_gset:N \g_point_xv_int }{ 2 }{\tempB}~
\MULTIPLY{ \tempB }{ \tempNum }{\solBn}~
\FRACTIONSIMPLIFY{ \solBn }{ \tempDenom }{\Bn}{\Bd}~
\ABSVALUE{ \Bn }\absBn~
% Writing expression for numerator of C coefficient
\SQUARE{ \g_point_xv_int }{ \hsq }~
\MULTIPLY{ \tempNum }{ \hsq }{\tempCl}~
\MULTIPLY{ \tempDenom }{ \int_gset:N \g_point_yv_int }{\tempCr}~
\ADD{ \tempCl }{ \tempCr }{\solCn}~
\FRACTIONSIMPLIFY{ \solCn }{ \tempDenom }{\Cn}{\Cd}~
\ABSVALUE{ \Cn }\absCn~
\if_odd:nTF \isone{}
$
\solA x^2
\isopp{\solB} \absB x
\isneg{\solC} \absC
$
}
\ExplSyntaxOff
\begin{document}
\newpage
\section*{Problem 7}
\begin{center}
\parabola
\end{center}
\paraexpand
\end{document}
큰 문서의 일부이기 때문에 불필요한 줄이 많고 거기에 어떤 부분이 내 섹션에 필요한지 100% 확신할 수 없습니다. 문서의 대부분을 잘라냈기 때문에 누락된 부분이 있으면 댓글을 달아 알려주세요. 다시 말하지만, 주어진 제약 조건에 따라 표준 형식의 무작위 2차 방정식을 생성하고 해당 방정식을 플롯한 다음 플롯 아래에 방정식의 확장된 형식을 나열하려고 합니다.
답변1
당신이 고집하지 않는다면 이것은 패키지가 쉽게 만드는 expl3
일종의 문제입니다 . sagetex
다음 코드를 고려해보세요.
\documentclass{article}
\usepackage{sagetex}
\begin{document}
\begin{sagesilent}
A = 0
while A == 0:
A = randint(-2,3)
D = randint(-1,5)
h = randint(-2,2)
k = randint(-2,2)
f = (A/D)*(x-h)^2+k
parab = plot(f,-4,4,color='red')
g = expand(f)
\end{sagesilent}
If $A=\sage{A}$, $D=\sage{D}$, $h=\sage{h}$, and $k=\sage{k}$ then the
function $f(x)=\frac{A}{D}(x-h)^2+k$ can be written as
$f(x)= \frac{\sage{A}}{\sage{D}}(x-(\sage{h}))^2+(\sage{k})$ or
$f(x)=\sage{f}$. Its graph is a parabola:
\begin{center}
\sageplot[width=3.5in]{parab}
\end{center}
The standard form of the parabola is $\sage{g}$.
\end{document}
코드(Python)는 그보다 읽기 쉬우 expl3
며 코드가 많지 않다는 것을 알 수 있습니다. SAGE를 사용하여 플롯을 제공했지만 출력을 tikz/pgfplots로 강제 실행할 수 있습니다. 이 웹사이트에는 방법을 보여주는 수많은 예제가 있습니다. 내 답변여기그리고여기많은 예 중 두 가지에 불과합니다. 패키지 sagetex
는 컴퓨터 대수학 시스템을 사용하여 마법을 작동하므로 정점 형식에서 표준 형식으로 확장하는 작업은 에 의해 수행됩니다 g = expand(f)
. 에 대한 문서는 sagetex
다음과 같습니다여기CTAN에서. CAS는 SAGE이며 웹사이트는 다음과 같습니다.여기. LaTeX는 포함되어 있지 않으므로 컴퓨터에 LaTeX를 설치해야 합니다. 플랫폼에 따라 문제가 될 수 있으므로 무료코칼슘계정이 시작하는 가장 좋은 방법입니다. 그러면 클라우드를 통해 액세스할 수 있으므로 컴퓨터에 SAGE가 필요하지 않습니다.
답변2
LaTeX3에 대해 더 알고 싶다면 다음을 참조하세요.지도 시간내가 쓴 것.
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{expl3}
\ExplSyntaxOn
% https://tex.stackexchange.com/questions/253693/reducing-fractions-automatically-using-latex-3
\cs_set:Npn \svend_gcd:nn #1#2 {
\int_compare:nNnTF {#2} = { 0 } {#1}
{ \svend_gcd:ff {#2} { \int_mod:nn {#1} {#2} } }
}
\cs_generate_variant:Nn \svend_gcd:nn { ff }
\int_new:N \l__svend_tmp_int
\cs_set:Npn \svend_reduced:nnNN #1#2#3#4 {
\int_set:Nn \l__svend_tmp_int { \svend_gcd:nn {#1} {#2} }
\int_set:Nn #3 { \int_eval:n { #1 / \l__svend_tmp_int } }
\int_set:Nn #4 { \int_eval:n { #2 / \l__svend_tmp_int } }
}
\int_new:N \g_pb_a_int
\int_new:N \g_pb_d_int
\int_new:N \g_pb_h_int
\int_new:N \g_pb_k_int
\newcommand{\newparabola}{
\int_gset:Nn \g_pb_a_int {(2 * \int_rand:nn {0}{1} - 1) * \int_rand:nn {1}{2}}
\int_gset:Nn \g_pb_d_int {\int_rand:nn {1}{5}}
\int_gset:Nn \g_pb_h_int {\int_rand:nn {-2}{2}}
\int_gset:Nn \g_pb_k_int {\int_rand:nn {-2}{2}}
}
\cs_set:Npn \doc_int_safe_use:N #1 {
\int_compare:nNnT {#1} < {0} {
\int_use:N #1
}
\int_compare:nNnT {#1} > {0} {
+ \int_use:N #1
}
}
\int_new:N \l_tmpc_int
\int_new:N \l_tmpd_int
\int_new:N \l_tmpe_int
\cs_set:Npn \doc_frac_safe_output:nnnn #1#2#3#4 {
% extract sign
\int_set:Nn \l_tmpe_int {(#1) * (#2)}
\int_set:Nn \l_tmpa_int {\int_abs:n {#1}}
\int_set:Nn \l_tmpb_int {\int_abs:n {#2}}
\svend_reduced:nnNN {\l_tmpa_int} {\l_tmpb_int} \l_tmpc_int \l_tmpd_int
\str_case:nn {#3} {
{f} {
\int_compare:nNnT {\l_tmpe_int} < {0} {-}
\int_compare:nNnT {\l_tmpe_int} > {0} {+}
}
{n} {
\int_compare:nNnT {\l_tmpe_int} < {0} {-}
}
}
\int_compare:nNnT {\l_tmpc_int} = {0} {
\int_set:Nn \l_tmpd_int {1}
}
\int_compare:nNnTF {\l_tmpd_int} = {1} {
\str_case:nn {#4} {
{a} {
\int_use:N \l_tmpc_int
}
{z} {
\int_compare:nNnF {\l_tmpc_int} = {0} {
\int_use:N \l_tmpc_int
}
}
{n} {
\int_compare:nNnF {\l_tmpc_int} = {1} {
\int_use:N \l_tmpc_int
}
}
}
} {
\frac{\int_use:N \l_tmpc_int}{\int_use:N \l_tmpd_int}
}
}
% original parabola
\newcommand{\parabolao}{
\int_compare:nNnTF {\g_pb_h_int} = {0} {
$
\doc_frac_safe_output:nnnn {\g_pb_a_int} {\g_pb_d_int} {n} {n}
x^2 \doc_int_safe_use:N \g_pb_k_int
$
} {
$
\doc_frac_safe_output:nnnn {\g_pb_a_int} {\g_pb_d_int} {n} {n}
(x \doc_int_safe_use:N \g_pb_h_int )^2 \doc_int_safe_use:N \g_pb_k_int
$
}
}
% expanded parabola
\newcommand{\parabolae}{
\int_compare:nNnTF {\g_pb_h_int} = {0} {
$
\doc_frac_safe_output:nnnn {\g_pb_a_int} {\g_pb_d_int} {n} {n} x^2
\exp_args:Nx \doc_frac_safe_output:nnnn {\int_eval:n {
\g_pb_h_int * \g_pb_h_int * \g_pb_a_int + \g_pb_d_int * \g_pb_k_int}
} {\g_pb_d_int} {f} {a}
$
} {
$
\doc_frac_safe_output:nnnn {\g_pb_a_int} {\g_pb_d_int} {n} {n} x^2
\exp_args:Nx \doc_frac_safe_output:nnnn {\int_eval:n {2 * \g_pb_h_int * \g_pb_a_int}} {\g_pb_d_int} {f} {n} x
\exp_args:Nx \doc_frac_safe_output:nnnn {\int_eval:n {
\g_pb_h_int * \g_pb_h_int * \g_pb_a_int + \g_pb_d_int * \g_pb_k_int}
} {\g_pb_d_int} {f} {z}
$
}
}
% plot parabola
\newcommand{\parabolap}{
\begin{tikzpicture}
\begin{axis}[
width=0.7\textwidth,
height=0.7\textwidth,
grid=major,
xmin=-5,
xmax=5,
ymin=-5,
ymax=5,
axis~lines=center
]
\addplot[smooth, red, thick] {(\g_pb_a_int / \g_pb_d_int)*(x-\g_pb_h_int)^2+x-\g_pb_k_int};
\end{axis}
\end{tikzpicture}
}
\ExplSyntaxOff
\begin{document}
\newparabola
\par\parabolao
\par\parabolae
\begin{center}
\parabolap
\end{center}
\end{document}