• Welcome to پارسی‌لاتک.
 
از تاریخ ۱۳۹۳/۸/۱۴ به دلیل ارائه خدمات بهتر به سایت جدید پرسش و پاسخ مهاجرت کرده‌ایم؛ از این رو امکان عضویت و ارسال پست در تالار غیرفعال شده است. لطفاً برای پرسیدن سوال‌های خود به سایت جدید مراجعه کنید.

ورود به سایت جدید

به دست آوردن سایز طولانی‌ترین خط در یک پاراگراف

نویسنده فرشاد ترابی, فبریه 11, 2013, 08:27:53 قبل از ظهر

« قبلی - بعدی »

فرشاد ترابی

سلام دوستان

به فایل پیوست دقت کنید! در این فایل یک ماکرو نوشته شده که در اون قراره یک آرگومان دریافت بشه.
این آرگومان میتونه دارای شکست خط یا حتی خط خالی به عنوان پاراگراف باشه.
حالا باید بین خطوط بگرده و طولانی‌ترین خط را پیدا کنه و پهنای یک parbox را برابر با آن قرار بده.

ولی وقتی برنامه اجرا میشه، خطوط شکست را صرف نظر می‌کنه و طول به دست آمده صحیح نیست.
راه حل چیه؟

وحید دامن‌افشان

اگر درست منظورتون رو متوجه شده باشم، کد پایین، مشکل‌تون رو حل نمی‌کنه؟
اگر نه، می‌شه بیشتر توضیح بدین؟

\documentclass[10pt]{article}
\usepackage{lipsum}
\newcommand{\Class}[1]
{
\par\noindent\fbox{\begin{tabular}{l}
#1
\end{tabular}}\par
}
\begin{document}
\lipsum[1]
\Class
{double Width \\
double Height this is some text\\
double Perimeter\\
double Area\\
}
\lipsum[1]
\end{document}

فرشاد ترابی

نه این مشکل را حل نمیکنه چون وقتی مثل کد زیر برای فونت  آرگومان از دستور \texttt استفاده می‌شه، دیگه شکست خط توش خطا می‌ده.
برنامه زیر را پردازش کنید:


\documentclass[10pt]{article}
\usepackage{lipsum}
\newcommand{\Class}[1]
{
\par\noindent\fbox{\begin{tabular}{l}
\texttt{ #1}
\end{tabular}}\par
}
\begin{document}
\lipsum[1]
\Class
{double Width \\
double Height this is some text\\
double Perimeter\\
double Area\\
}
\lipsum[1]
\end{document}



فرشاد ترابی

راه حلش رو پیدا کردم. از ترکیب کاری که شما کردید با کاری که خودم کردم. به اینصورت


\sbox{\myboxxx}{\begin{tabular}{l}#1\end{tabular}}
\fbox{\parbox{\wd\myboxxx}{\lr{\texttt{#1}}}}


البته احتمال بسیار زیاد راه حل های بهتر هم داره ولی این هم کار می‌کنه.

vafa

یک مثال، بدون استفاده از محیط tabular اما با استفاده از بسته varwidth و محیط varwidth. همچنین در این نمونه به جای دستور، محیط تعریف کردم که برای متنهای طولانی، کارایی بهتری دارد:

\documentclass{article}
\usepackage{varwidth}
\makeatletter
\newsavebox\mybox
\newenvironment{myfbox}{%
\begin{lrbox}{\mybox}%
\begin{varwidth}{\linewidth}
}{%
\end{varwidth}
\end{lrbox}%
\vskip10pt
\noindent
\fbox{\usebox\mybox}%
\vskip10pt
}
\makeatother
\begin{document}
\begin{myfbox}
This is the first test\\
This is the second test\\
This is the third test which is much longer
\end{myfbox}
\end{document}

vafa

نقل قول از: Farschad در فبریه 11, 2013, 08:27:53 قبل از ظهر
سلام دوستان

به فایل پیوست دقت کنید! در این فایل یک ماکرو نوشته شده که در اون قراره یک آرگومان دریافت بشه.
این آرگومان میتونه دارای شکست خط یا حتی خط خالی به عنوان پاراگراف باشه.
حالا باید بین خطوط بگرده و طولانی‌ترین خط را پیدا کنه و پهنای یک parbox را برابر با آن قرار بده.

ولی وقتی برنامه اجرا میشه، خطوط شکست را صرف نظر می‌کنه و طول به دست آمده صحیح نیست.
راه حل چیه؟
به این خاطر که شما از \sbox استفاده کردید که برای کادرهای افقی کاربرد دارد نه برای کادرهای عمودی.