تالار گفتگوی پارسی‌لاتک

لاتک LATEX => ریاضیات و علوم => نويسنده: ohnood در دسامبر 05, 2012, 09:42:15 pm

عنوان: شماره‌گذاری یک فرمول چندبخشی
رسال شده توسط: ohnood در دسامبر 05, 2012, 09:42:15 pm
فرض کنید فرمول۳ از فصل ۲ (۲-۳) شامل سه بخش باشه. چطور می‌شه هر کدوم رو با یک شماره نشون داد؟ (یعنی با شماره‌های (۲-۳-۱)، (۲-۳-۲) و (۲-۳-۳).)
عنوان: پاسخ : شماره‌گذاری یک فرمول چندبخشی
رسال شده توسط: Mohsen Avaji در دسامبر 05, 2012, 10:04:35 pm
سلام، امیدوارم به کارتون بیاد
\usepackage{amsmath}

\begin{subequations}

\begin{equation}
\operatorname{min}_{a,b,c}
\frac{1}{2}\mathbf{w}^{T}\mathbf{w} + C \sum_{i=1}^{l}\xi_{i}
\end{equation}

\begin{equation}
y_{i}\left(\mathbf{w}^{T}\phi(x_{i})+b\right)
\end{equation}

\end{subequations}
عنوان: پاسخ : شماره‌گذاری یک فرمول چندبخشی
رسال شده توسط: ohnood در دسامبر 06, 2012, 07:43:36 am
سپاس برای پاسختون؛ اما تو این حالت شماره‌ها (مثلاً) به‌صورت (۲-۳آ)، (۲-۳ب)، (۲-۳ج) و ... گذاشته می‌شن. اگه بشه یکی از این دو کار رو کرد بهتر می‌شه:
۱- به‌جای حروف «ابجد» از حروف فارسی (آ، ب، پ و ...) استفاده بشه؛ یا این‌که
۲- به‌طور کلی به‌جای حروف از اعداد استفاده بشه.
در ضمن اگه بشه قبلش یه خط تیره (-) یا نقطه (.) هم گذاشت خیلی خوب می‌شه!! (یعنی بشه (۲-۳-آ) یا (۲-۳.آ) یا (۲-۳-۱))
عنوان: پاسخ : شماره‌گذاری یک فرمول چندبخشی
رسال شده توسط: هادی صفی‌اقدم در دسامبر 06, 2012, 01:21:07 pm
سلام، امیدوارم به کارتون بیاد
\usepackage{amsmath}

\begin{subequations}

\begin{equation}
\operatorname{min}_{a,b,c}
\frac{1}{2}\mathbf{w}^{T}\mathbf{w} + C \sum_{i=1}^{l}\xi_{i}
\end{equation}

\begin{equation}
y_{i}\left(\mathbf{w}^{T}\phi(x_{i})+b\right)
\end{equation}

\end{subequations}
خط‌های خالی و استفاده از دو equation پشت سر هم باعث ایجاد فاصله‌ی اضافی میشه.
بهتره از align استفاده کنین. یا محیط‌های مشابه چند خطی...
همچنین استفاده از دستور ‪‎\operatorname{min}‬ فکر نکنم درست باشه. چون خود دستور ‪\min‬ این کارو میکنه و توی لاتک تعریف شده و نیاز به تعریف مجدد اپراتور ریاضی نیست.

سپاس برای پاسختون؛ اما تو این حالت شماره‌ها (مثلاً) به‌صورت (۲-۳آ)، (۲-۳ب)، (۲-۳ج) و ... گذاشته می‌شن. اگه بشه یکی از این دو کار رو کرد بهتر می‌شه:
۱- به‌جای حروف «ابجد» از حروف فارسی (آ، ب، پ و ...) استفاده بشه؛ یا این‌که
۲- به‌طور کلی به‌جای حروف از اعداد استفاده بشه.
در ضمن اگه بشه قبلش یه خط تیره (-) یا نقطه (.) هم گذاشت خیلی خوب می‌شه!! (یعنی بشه (۲-۳-آ) یا (۲-۳.آ) یا (۲-۳-۱))
استانداردش اینه. اما اگر دوس داشتین تغییر بدین باید به صورت زیر عمل کنید. (در راهنمای بسته‌ی amsmath نوشته.)
\begin{subequations}‎‎
\renewcommand{\theequation}{\theparentequation{}.\alph{equation}}
‎\begin{align}‎
‎\operatorname{min}_{a,b,c}‎
‎\frac{1}{2}\mathbf{w}^{T}\mathbf{w}‎ + ‎C \sum_{i=1}^{l}\xi_{i}‎
‎\\‎
‎y_{i}\left(\mathbf{w}^{T}\phi(x_{i})+b\right)‎
‎\end{align}‎
‎\end{subequations}‎
عنوان: پاسخ : شماره‌گذاری یک فرمول چندبخشی
رسال شده توسط: وحید دامن‌افشان در دسامبر 06, 2012, 02:05:37 pm
استانداردش اینه. اما اگر دوس داشتین تغییر بدین باید به صورت زیر عمل کنید. (در راهنمای بسته‌ی amsmath نوشته.)
می‌شه تعریف محیط subequations رو به صورت فایل پیوست شده، تغییر داد تا دیگه مجبور نباشیم اون خط دستور رو هر بار وارد کنیم.
عنوان: پاسخ : شماره‌گذاری یک فرمول چندبخشی
رسال شده توسط: هادی صفی‌اقدم در دسامبر 06, 2012, 02:13:56 pm
وحید جان، میشه در مورد اون کد یکم توضیح بدی؟
در مورد let مخصوصا.
ممنون
عنوان: پاسخ : شماره‌گذاری یک فرمول چندبخشی
رسال شده توسط: وحید دامن‌افشان در دسامبر 06, 2012, 02:57:40 pm
وحید جان، میشه در مورد اون کد یکم توضیح بدی؟
در مورد let مخصوصا.
ممنون
برای راحتی کار، کدهارو شماره‌گذاری می‌کنم تا بتونم بهشون ارجاع بدم:
1 \let\oldsubequations\subequations
2 \let\endoldsubequations\endsubequations
3 \renewenvironment{subequations}{\bgroup\oldsubequations%
4 \renewcommand{\theequation}{\theparentequation{}\@SepMark\alph{equation}}%
5 }%
6 {\endoldsubequations\egroup}
همون‌طور که می‌دونی یک دستور یا محیط رو نمی‌شه برحسب خودش redefine کرد؛ چون داخل یه حلقه بی‌پایان می‌افته. بنابراین اول باید تعریف‌شو (تعریف قدیمی‌شو) توی یه دستور جدید (در اینجا، \oldsubequations) ذخیره کنیم. برای این کار از دستور let\ استفاده کردم. شکل کلی استفاده از این دستور به صورت
\let\newcommand=\oldcommandهستش. وجود علامت مساوی هم اختیاریه. در ضمن، چون در اینجا می‌خوایم که یه محیط (و نه یه دستور) رو redefine کنیم، پس باید هر دو دستور
‎\begin{subequations}‎و
‎\end{subequations}‎رو توی یه دستور جدید ذخیره کنیم که با دستورهای شماره ۱ و ۲ این کار انجام شده (اگه می‌خواستیم یه دستوری مثل foo رو redefine کنیم، احتیاجی به خط شماره ۲ نبود). دقت کن که موقع تعریف یا بازتعریف یه محیطی مثل foo، بجای
\begin{foo}و
\end{foo}کافیه فقط به ترتیب بنویسیم foo\ و endfoo\.
خب حالا می‌ریم و در خط شماره ۳، شروع می‌کنیم به redefine کردن محیط subequations. دقت کن که در اینجا بجای subequations باید از \oldsubequations استفاده کنیم؛ (چون در غیر این صورت، دوباره وارد همون حلقه بی‌پایان می‌افتیم). خط ۴ و ۵ هم که احتیاج به توضیح نداره. با استفاده از خط ۶ هم، کار redefine کردن رو تموم می‌کنیم. اما کار دو دستور bgroup\ و \egroup چی هست؟ این دو دستور مخفف دستورهای begingroup\ و endgroup\ هستن و همون‌طور که از اسمشون پیداست، برای ایجاد یه حائل ازشون استفاده می‌شه. به عبارت دیگه توی کد بالا، برای اینکه مطمئن شیم که اثر خط شماره ۴ فقط توی این محیط باشه، خط شماره ۴ رو بین این دستور قرار می‌دیم تا اثر خط شماره ۴ روی بقیه سندمون تاثیر نذاره.
امیدوارم که خوب توضیح داده باشم. هرکجاش رو که متوجه نشدی، بگو تا دوباره توضیح بدم.



عنوان: پاسخ : شماره‌گذاری یک فرمول چندبخشی
رسال شده توسط: vafa در دسامبر 06, 2012, 03:27:53 pm
برای راحتی کار، کدهارو شماره‌گذاری می‌کنم تا بتونم بهشون ارجاع بدم:
1 \let\oldsubequations\subequations
2 \let\endoldsubequations\endsubequations
3 \renewenvironment{subequations}{\bgroup\oldsubequations%
4 \renewcommand{\theequation}{\theparentequation{}\@SepMark\alph{equation}}%
5 }%
6 {\endoldsubequations\egroup}
همون‌طور که می‌دونی یک دستور یا محیط رو نمی‌شه برحسب خودش redefine کرد؛ چون داخل یه حلقه بی‌پایان می‌افته. بنابراین اول باید تعریف‌شو (تعریف قدیمی‌شو) توی یه دستور جدید (در اینجا، \oldsubequations) ذخیره کنیم. برای این کار از دستور let\ استفاده کردم. شکل کلی استفاده از این دستور به صورت
\let\newcommand=\oldcommandهستش. وجود علامت مساوی هم اختیاریه. در ضمن، چون در اینجا می‌خوایم که یه محیط (و نه یه دستور) رو redefine کنیم، پس باید هر دو دستور
‎\begin{subequations}‎و
‎\end{subequations}‎رو توی یه دستور جدید ذخیره کنیم که با دستورهای شماره ۱ و ۲ این کار انجام شده (اگه می‌خواستیم یه دستوری مثل foo رو redefine کنیم، احتیاجی به خط شماره ۲ نبود). دقت کن که موقع تعریف یا بازتعریف یه محیطی مثل foo، بجای
\begin{foo}و
\end{foo}کافیه فقط به ترتیب بنویسیم foo\ و endfoo\.
خب حالا می‌ریم و در خط شماره ۳، شروع می‌کنیم به redefine کردن محیط subequations. دقت کن که در اینجا بجای subequations باید از \oldsubequations استفاده کنیم؛ (چون در غیر این صورت، دوباره وارد همون حلقه بی‌پایان می‌افتیم). خط ۴ و ۵ هم که احتیاج به توضیح نداره. با استفاده از خط ۶ هم، کار redefine کردن رو تموم می‌کنیم. اما کار دو دستور bgroup\ و \egroup چی هست؟ این دو دستور مخفف دستورهای begingroup\ و endgroup\ هستن و همون‌طور که از اسمشون پیداست، برای ایجاد یه حائل ازشون استفاده می‌شه. به عبارت دیگه توی کد بالا، برای اینکه مطمئن شیم که اثر خط شماره ۴ فقط توی این محیط باشه، خط شماره ۴ رو بین این دستور قرار می‌دیم تا اثر خط شماره ۴ روی بقیه سندمون تاثیر نذاره.
امیدوارم که خوب توضیح داده باشم. هرکجاش رو که متوجه نشدی، بگو تا دوباره توضیح بدم.
احتیاجی به \bgroup و \egroup اضافی نیست. به جای از نو تعریف کردن محیط خیلی ساده می‌تونی از دستور \bidi@AtBeginEnvironment استفاده کنی.