ระบบจัดวางรูปง่าย

Sep 09 2020

ฉันมักจะพบว่าตัวเองคัดลอกและวางชิ้นใหญ่ของ{figure}และ{table}รหัสรอบเอกสารของฉันพยายามที่จะปรับปรุงตำแหน่งของตัวเลขของฉัน มันเกิดข้อผิดพลาดและน่ารำคาญเล็กน้อย

ฉันรู้เกี่ยวกับอาร์กิวเมนต์ [H] สำหรับสภาพแวดล้อมแบบโฟลต ที่นี่ฉันไม่ได้พยายามทำให้ตำแหน่งลอยในผลลัพธ์เช่นเอกสาร PDF ตรงกับตำแหน่งของสภาพแวดล้อมการลอยของฉัน ฉันแค่ต้องการวิธีที่ง่ายกว่าในการย้ายโค้ดสำหรับการลอยรอบไฟล์ tex ของฉันที่ไม่เกี่ยวข้องกับการคัดลอกและวางโค้ดชิ้นใหญ่ ๆ

ฉันสงสัยว่าเป็นไปได้ไหมที่จะสร้างระบบที่มีสภาพแวดล้อมและมาโครใหม่ซึ่งฉันสามารถทำอะไรแบบนี้ได้

\begin{placer}{tag}
\begin{figure}
...
\end{figure}
\end{placer}

ความคิดของฉันคือplacerสภาพแวดล้อมใหม่เพียงแค่รวบรวมทุกอย่างและบันทึกด้วยชื่อตามแท็กอาร์กิวเมนต์

จากนั้นฉันก็วางรูปที่ฉันต้องการโดยใช้มาโครใหม่

\place{tag}

ตามหลักการแล้วจะสามารถใช้\place{tag} ก่อนข้อมูลโค้ดด้านบนและยังคงได้ผลลัพธ์ที่ต้องการ และตามหลักการแล้วจะไม่ต้องอาศัยการเขียนไฟล์หรือขั้นตอนการรวบรวมเพิ่มเติมใด ๆ ฉันคิดว่ามันจะดีมากถ้าโดยค่าเริ่มต้นลูกลอยถูกวางไว้ตามค่าเริ่มต้นที่\begin{placer}{tag}จุดนั้นหาก\place{tag}ไม่เคยถูกเรียก

ระบบแบบนี้มีความเป็นไปได้หรือไม่?

ถ้าเป็นเช่นนั้นฉันอยากจะไปให้ไกลกว่านี้ ฉันต้องการกำหนดสภาพแวดล้อมรูปและตารางลอยใหม่เพื่อแคชเนื้อหาโดยอัตโนมัติดังที่กล่าวมาข้างต้นดังนั้นจึงสามารถวางผ่านมาโครสถานที่ด้านบนโดยใช้ป้ายกำกับบางรายการ

ฉันสามารถโหลดแพคเกจบางอย่างที่ติดตั้งและเริ่มย้ายตัวเลขและตารางไปรอบ ๆ เอกสารโดยเพิ่มคำสั่ง \ place {fig: anything} พร้อมอาร์กิวเมนต์ที่สอดคล้องกับแท็กบางส่วนของรูปที่เกี่ยวข้อง อะไรทำนองนี้

\usepackage{placer}
\begin{document}

This is a document with one figure.

\begin{figure}
...
\label{fig:whatever}
\end{figure}

Actually, let’s put the figure code below this text.

\place{fig:whatever}.

คำตอบ

2 egreg Sep 09 2020 at 16:58

คุณสามารถใช้xparseเพื่อกำหนดสภาพแวดล้อมที่จัดเก็บเนื้อหา รายการทรัพย์สินน่าจะเป็นเครื่องมือที่เหมาะสม

\documentclass{article}
\usepackage{xparse}

\usepackage{graphicx}
\usepackage{booktabs}

\usepackage{lipsum} % just for mock text

\ExplSyntaxOn

\prop_new:N \g_innisfree_floats_prop

\NewDocumentEnvironment{placer}{m +b}
 {
  \prop_gput:Nnn \g_innisfree_floats_prop { #1 } { #2 }
 }
 {}

\NewDocumentCommand{\place}{m}
 {
  \prop_item:Nn \g_innisfree_floats_prop { #1 }
 }

\ExplSyntaxOff

%%% define the objects (can be in a different file to be \input)

\begin{placer}{fig:example}
\begin{figure}[htp]
\centering
\includegraphics[width=4cm]{example-image}

\caption{A figure\label{fig:example}}
\end{figure}
\end{placer}

\begin{placer}{tab:example}
\begin{table}[tp]
\centering

\caption{A table\label{tab:example}}

\begin{tabular}{lc}
\toprule
X & Y \\
\midrule
A & 1 \\
B & 2 \\
\bottomrule
\end{tabular}
\end{table}
\end{placer}

\begin{document}

\lipsum[2]

\place{fig:example}

\lipsum[3-5]

\place{tab:example}

\lipsum

\end{document}