對齊命令 flushleft 相比 aggedright 有什麼區別與問題,而因此不應使用?


沒有 flushleft,人家那是 flushleft 環境。用法是

egin{flushleft}
左齊正文
end{flushleft}

flushleft 環境是一個左對齊的只有一項的 trivlist 列表環境,與上下文有額外間距。意義不同。也就是說上面的 flushleft 環境等價於:

egin{trivlist}

aggedrightitem
elax
左齊正文
end{trivlist}

flushleft 環境就這麼定義的。

沒有不推薦使用 flushleft 環境,用對場合就是,但你不能把一個環境拆開只用一半。

咦那為什麼用 flushleft 也能有效果不出錯?那是湊巧。


我來補充一下 劉海洋 的回答。

0

flushleft 以及 flushright 都是環境,對應的環境是 center 環境。用 flushleft 和 flushright 來實現文字的左對齊和右對齊,是一個歷史遺留問題。具體是哪一篇網誌或者哪一本書先開啟的這個用法已經不可考,但是影響頗廣。比如 ctex 宏包早年就有這個 bug,本該用
aggedright 的地方,使用了 flushleft。

1

所以 flushleft 是什麼呢?

在 LaTeX2e 里,大部分的環境都有對應的命令。比如

egin{foo}
...
end{foo}

就對應著命令

foo
...
endfoo

我舉一個例子。

documentclass{article}

ewenvironment{bar}{}{}

ewcommand{ar}{
elax}
egin{document}
dummy
end{document}

在這個例子里,我先定義了名為 bar 的環境,然後定義了 ar 這個命令。如果你編譯的話,編譯器會告訴你 ar 已經被定義了。報錯的原因就是,在定義 bar 環境的時候,實際上就已經定義了 ar 這個命令。

這就是為什麼 flushleft 可用的原因——定義了這個環境,順帶定義了這個命令。

BTW,以前有一些和環境鉤子有關的宏包,就是通過重定義 ar 和 endbar 來處理的。當然,這麼做並不好。

2

接下來,構造一個誤用 flushleft 造成錯誤效果的例子。

代碼:

%!TEX program = xelatex
documentclass{ctexart}
CTEXsetup[format = {fseriesLARGEflushleft}]{section}

enewenvironment{flushleft}
{egin{enumerate}item[]
oindent
aggedright}
{end{enumerate}}
egin{document}
section{章節標題}
我本不應該是粗體字。
end{document}

這裡使用 CTEXsetup 來重定義 section 的格式,誤用了 flushleft 這個命令。(實際上老版本的 ctex 宏包就有類似的誤用)之後我基於某種特別的需求重定義了 flushleft 這個環境。

由於 flushleft 實際上是 flushleft 環境的一部分,所以在這個重定義的過程中,flushleft 也被重定義了。於是這個不封閉的「環境」就影響了後續的內容,造成錯誤。

3

總結一下。

flushleft 實際上是 flushleft 環境的一部分,不應當單獨拿出來使用;同理 flushright.


推薦閱讀:

TeX 編程有哪些資料與工具?
如何評價 upTeX?
商業出版公司真的有用 LaTeX 的嗎?
你為什麼用LaTeX?
如何配置 MacTeX 的中文支持?

TAG:LaTeX | TeX | 宏計算機 |