การทำงานกับสารบัญ
บ่อยครั้งที่คุณจะทำงานกับเอกสารที่มีสารบัญ (TOC) การใช้ Aspose.Words คุณสามารถแทรกสารบัญของคุณเองหรือสร้างสารบัญที่มีอยู่ในเอกสารขึ้นมาใหม่ทั้งหมดโดยใช้โค้ดเพียงไม่กี่บรรทัด บทความนี้สรุปวิธีการทำงานกับเขตข้อมูลสารบัญและสาธิต:
- วิธีแทรก
TOC
ใหม่ - อัปเดต TOC ใหม่หรือที่มีอยู่ในเอกสาร
- ระบุสวิตช์เพื่อควบคุมการจัดรูปแบบและโครงสร้างโดยรวมของ TOC
- วิธีปรับเปลี่ยนสไตล์และรูปลักษณ์ของสารบัญ
- วิธีลบฟิลด์
TOC
ทั้งหมดพร้อมกับรายการทั้งหมดในเอกสาร
แทรกสารบัญโดยทางโปรแกรม
คุณสามารถแทรกฟิลด์ TOC
(สารบัญ) ลงในเอกสารที่ตำแหน่งปัจจุบันได้โดยการเรียกเมธอด InsertTableOfContents
สารบัญในเอกสาร Word สามารถสร้างได้หลายวิธีและจัดรูปแบบโดยใช้ตัวเลือกที่หลากหลาย ฟิลด์จะสลับที่คุณส่งไปยังวิธีการควบคุมวิธีการสร้างตารางและแสดงในเอกสารของคุณ
สวิตช์เริ่มต้นที่ใช้ใน TOC
ที่แทรกใน Microsoft Word คือ "\o “1-3 \เอช \z \u” คำอธิบายของสวิตช์เหล่านี้รวมถึงรายการสวิตช์ที่รองรับมีอยู่ในบทความถัดไป คุณสามารถใช้คำแนะนำนั้นเพื่อรับสวิตช์ที่ถูกต้อง หรือหากคุณมีเอกสารที่มี TOC
ที่คล้ายกันที่คุณต้องการอยู่แล้ว คุณสามารถแสดงโค้ดฟิลด์ (ALT+F9) และคัดลอกสวิตช์จากฟิลด์ได้โดยตรง
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการแทรกฟิลด์สารบัญลงในเอกสาร:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
// The path to the documents directory. | |
string dataDir = RunExamples.GetDataDir_WorkingWithDocument(); | |
// Initialize document. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
// Insert a table of contents at the beginning of the document. | |
builder.InsertTableOfContents("\\o \"1-3\" \\h \\z \\u"); | |
// The newly inserted table of contents will be initially empty. | |
// It needs to be populated by updating the fields in the document. | |
doc.UpdateFields(); | |
dataDir = dataDir + "DocumentBuilderInsertTOC_out.doc"; | |
doc.Save(dataDir); |
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการแทรกสารบัญ (TOC) ลงในเอกสารโดยใช้สไตล์ส่วนหัวเป็นรายการ
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
// Insert a table of contents at the beginning of the document. | |
builder.InsertTableOfContents("\\o \"1-3\" \\h \\z \\u"); | |
// Start the actual document content on the second page. | |
builder.InsertBreak(BreakType.PageBreak); | |
// Build a document with complex structure by applying different heading styles thus creating TOC entries. | |
builder.ParagraphFormat.StyleIdentifier = StyleIdentifier.Heading1; | |
builder.Writeln("Heading 1"); | |
builder.ParagraphFormat.StyleIdentifier = StyleIdentifier.Heading2; | |
builder.Writeln("Heading 1.1"); | |
builder.Writeln("Heading 1.2"); | |
builder.ParagraphFormat.StyleIdentifier = StyleIdentifier.Heading1; | |
builder.Writeln("Heading 2"); | |
builder.Writeln("Heading 3"); | |
builder.ParagraphFormat.StyleIdentifier = StyleIdentifier.Heading2; | |
builder.Writeln("Heading 3.1"); | |
builder.ParagraphFormat.StyleIdentifier = StyleIdentifier.Heading3; | |
builder.Writeln("Heading 3.1.1"); | |
builder.Writeln("Heading 3.1.2"); | |
builder.Writeln("Heading 3.1.3"); | |
builder.ParagraphFormat.StyleIdentifier = StyleIdentifier.Heading2; | |
builder.Writeln("Heading 3.2"); | |
builder.Writeln("Heading 3.3"); | |
doc.UpdateFields(); | |
dataDir = dataDir + "DocumentBuilderInsertTableOfContents_out.doc"; | |
doc.Save(dataDir); |
TOC
แต่ไม่มีเนื้อหาที่มองเห็นได้ เนื่องจากมีการแทรกช่อง TOC
แล้ว แต่ยังไม่ได้เติมข้อมูลจนกว่าจะมีการอัปเดตในเอกสาร ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้จะกล่าวถึงในหัวข้อถัดไป
อัปเดตสารบัญ
Aspose.Words ช่วยให้คุณสามารถอัปเดต TOC
ได้อย่างสมบูรณ์ด้วยโค้ดเพียงไม่กี่บรรทัด ซึ่งสามารถทำได้เพื่อเติมข้อมูล TOC
ที่แทรกใหม่หรือเพื่ออัปเดต TOC
ที่มีอยู่หลังจากทำการเปลี่ยนแปลงเอกสารแล้ว ต้องใช้สองวิธีต่อไปนี้เพื่ออัปเดตฟิลด์ TOC
ในเอกสาร:
โปรดทราบว่าจำเป็นต้องเรียกใช้วิธีการอัพเดตทั้งสองนี้ตามลำดับ หากกลับรายการสารบัญจะถูกเติมแต่จะไม่มีหมายเลขหน้าแสดง สามารถอัปเดต TOC ที่แตกต่างกันจำนวนเท่าใดก็ได้ วิธีการเหล่านี้จะอัปเดต TOC ทั้งหมดที่พบในเอกสารโดยอัตโนมัติ
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีสร้างฟิลด์ TOC
ใหม่ในเอกสารโดยเรียกใช้การอัปเดตฟิลด์:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
doc.UpdateFields(); |
การเรียก UpdateFields ครั้งแรกจะสร้าง TOC
รายการข้อความทั้งหมดจะถูกเติม และ TOC
จะปรากฏขึ้นเกือบเสร็จสมบูรณ์ สิ่งเดียวที่ขาดหายไปคือหมายเลขหน้าซึ่งตอนนี้แสดงด้วย “?” การเรียก UpdatePageLayout ครั้งที่สองจะสร้างเค้าโครงของเอกสารในหน่วยความจำ จำเป็นต้องดำเนินการนี้เพื่อรวบรวมหมายเลขหน้าของรายการ หมายเลขหน้าที่ถูกต้องซึ่งคำนวณจากการโทรนี้จะถูกแทรกลงใน TOC
ใช้สวิตช์เพื่อควบคุมพฤติกรรมของสารบัญ
เช่นเดียวกับฟิลด์อื่นๆ ฟิลด์ TOC
สามารถยอมรับสวิตช์ที่กำหนดภายในโค้ดฟิลด์ที่ควบคุมวิธีการสร้างสารบัญ สวิตช์บางตัวใช้เพื่อควบคุมว่ารายการใดบ้างที่รวมอยู่และระดับใด ในขณะที่สวิตช์บางตัวใช้เพื่อควบคุมลักษณะที่ปรากฏของ TOC สวิตช์สามารถรวมเข้าด้วยกันเพื่อให้สามารถผลิตสารบัญที่ซับซ้อนได้
ตามค่าเริ่มต้น สวิตช์ด้านบนเหล่านี้จะรวมไว้เมื่อแทรก TOC
เริ่มต้นในเอกสาร TOC
ที่ไม่มีสวิตช์จะรวมเนื้อหาจากรูปแบบส่วนหัวที่มีอยู่แล้วภายใน (เหมือนกับว่าสวิตช์ \O ถูกตั้งค่าไว้) สวิตช์ TOC
ที่พร้อมใช้งานที่รองรับโดย Aspose.Words มีดังต่อไปนี้และมีการอธิบายการใช้งานโดยละเอียด สามารถแบ่งออกเป็นส่วนต่างๆ ตามประเภทได้ สวิตช์ในส่วนแรกจะกำหนดเนื้อหาที่จะรวมไว้ใน TOC
และสวิตช์ในส่วนที่สองจะควบคุมลักษณะที่ปรากฏของ TOC หากไม่มีสวิตช์แสดงอยู่ที่นี่ แสดงว่าสวิตช์ไม่รองรับในขณะนี้ สวิตช์ทั้งหมดจะได้รับการสนับสนุนในเวอร์ชันต่อๆ ไป เรากำลังเพิ่มการสนับสนุนเพิ่มเติมในทุกรุ่น
สวิตช์ทำเครื่องหมายรายการ
สวิตช์ | คำอธิบาย |
---|---|
Heading Styles (\O สวิตช์) |
สวิตช์นี้กำหนดว่า |
![working-with-table-of-contents-styles](/words/net/working-with-table-of-contents/working-with-table-of-contents-2.png)
เนื้อหาใดๆ ที่จัดรูปแบบด้วยสไตล์เหล่านี้จะรวมอยู่ในสารบัญ ระดับของส่วนหัวจะกำหนดระดับลำดับชั้นที่สอดคล้องกันของรายการใน TOC ตัวอย่างเช่น ย่อหน้าที่มีลักษณะหัวเรื่อง 1 จะถือเป็นระดับแรกใน `TOC` ในขณะที่ย่อหน้าที่มีหัวเรื่อง 2 จะถือเป็นระดับถัดไปในลำดับชั้นและอื่นๆ
| | **Outline Levels***(\U สวิตช์)* |
แต่ละย่อหน้าสามารถกำหนดระดับเค้าร่างภายใต้ตัวเลือกย่อหน้า
![working-with-table-of-contents-paragraph](/words/net/working-with-table-of-contents/working-with-table-of-contents-3.png)
การตั้งค่านี้กำหนดระดับที่ย่อหน้านี้ควรได้รับการปฏิบัติในลำดับชั้นของเอกสาร นี่เป็นแนวทางปฏิบัติที่ใช้กันทั่วไปซึ่งใช้ในการจัดโครงสร้างเค้าโครงของเอกสารได้อย่างง่ายดาย สามารถดูลำดับชั้นนี้ได้โดยเปลี่ยนเป็นมุมมองโครงร่างใน Microsoft Word เช่นเดียวกับสไตล์ส่วนหัว สามารถมีระดับเค้าร่างได้ 1 – 9 ระดับ นอกเหนือจากระดับ "ข้อความเนื้อหา" เค้าร่างระดับ 1 – 9 จะปรากฏในปี `TOC` ในระดับที่สอดคล้องกันของลำดับชั้น
เนื้อหาใดๆ ที่มีระดับเค้าร่างที่ตั้งค่าในรูปแบบย่อหน้าหรือบนย่อหน้าโดยตรงจะรวมอยู่ใน TOC ใน Aspose.Words ระดับเค้าร่างจะแสดงด้วยคุณสมบัติ `ParagraphFormat.OutlineLevel` ของโหนดย่อหน้า ระดับเค้าร่างของลักษณะย่อหน้าจะแสดงในลักษณะเดียวกันโดยคุณสมบัติ `Style.ParagraphFormat`
โปรดทราบว่าสไตล์ส่วนหัวที่มีอยู่แล้วภายใน เช่น หัวเรื่อง 1 มีการตั้งค่าบังคับระดับเค้าร่างในการตั้งค่าสไตล์
*(\T สวิตช์)* |
สวิตช์นี้จะอนุญาตให้ใช้สไตล์ที่กำหนดเองเมื่อรวบรวมรายการที่จะใช้ใน TOC ซึ่งมักจะใช้ร่วมกับสวิตช์ \O เพื่อรวมสไตล์ที่กำหนดเองพร้อมกับสไตล์หัวเรื่องที่มีอยู่แล้วภายใน TOC
พารามิเตอร์ของสวิตช์ควรอยู่ภายในเครื่องหมายคำพูด สามารถใส่สไตล์ที่กำหนดเองได้หลายแบบ โดยสำหรับแต่ละสไตล์ ควรระบุชื่อ ตามด้วยเครื่องหมายจุลภาค ตามด้วยระดับที่สไตล์ควรปรากฏใน `TOC` สไตล์เพิ่มเติมยังคั่นด้วยเครื่องหมายจุลภาคเช่นกัน
เช่น
<p> { TOC \o "1-3" \t "CustomHeading1, 1, CustomHeading2, 2"} </p><p>
จะใช้เนื้อหาที่จัดสไตล์ด้วย CustomHeading1 เป็นเนื้อหาระดับ 1 ใน `TOC` และ CustomHeading2 เป็นระดับ 2
| | **Use TC Fields***(สวิตช์ \F และ \L)* |
ในเวอร์ชันเก่าของ Microsoft Word วิธีเดียวที่จะสร้าง `TOC` คือการใช้ฟิลด์ TC ฟิลด์เหล่านี้จะถูกแทรกที่ซ่อนอยู่ในเอกสาร แม้ว่ารหัสฟิลด์จะแสดงก็ตาม รวมถึงข้อความที่ควรแสดงในรายการและ `TOC` ถูกสร้างขึ้นจากข้อความเหล่านั้น ขณะนี้ฟังก์ชันการทำงานนี้ไม่ได้ใช้บ่อยนัก แต่อาจยังมีประโยชน์ในบางโอกาสเพื่อรวมรายการใน `TOC` ซึ่งไม่ได้เยื้องเพื่อให้มองเห็นได้ในเอกสาร
เมื่อแทรกฟิลด์เหล่านี้จะปรากฏถูกซ่อนไว้แม้ว่าจะมีการแสดงโค้ดฟิลด์ก็ตาม ไม่สามารถมองเห็นได้โดยไม่แสดงเนื้อหาที่ซ่อนอยู่ หากต้องการดูฟิลด์เหล่านี้ ต้องเลือกแสดงการจัดรูปแบบย่อหน้า
![working-with-table-of-contents-paragraph-settings](/words/net/working-with-table-of-contents/working-with-table-of-contents-4.png)
ฟิลด์เหล่านี้สามารถแทรกลงในเอกสารในตำแหน่งใดก็ได้เช่นเดียวกับฟิลด์อื่นๆ และแสดงด้วยการแจงนับ `FieldType.FieldTOCEntry`สวิตช์ \F ใน `TOC` ใช้เพื่อระบุว่าควรใช้เขตข้อมูล TC เป็นรายการ สวิตช์เองโดยไม่มีตัวระบุเพิ่มเติมหมายความว่าช่อง TC ใดๆ ในเอกสารจะถูกรวมไว้ด้วย พารามิเตอร์พิเศษใดๆ ซึ่งมักจะเป็นตัวอักษรตัวเดียวจะกำหนดว่าเฉพาะฟิลด์ TC ซึ่งมีสวิตช์ \f ที่ตรงกันเท่านั้นที่จะรวมอยู่ใน TOC เช่น *
<p> { TOC \f t } </p><p>
จะรวมเฉพาะช่อง TC เช่น
p> { TC \f t }</p><p>
ฟิลด์ `TOC` ยังมีสวิตช์ที่เกี่ยวข้อง สวิตช์ "\L" ระบุว่ารวมเฉพาะฟิลด์ TC ที่มีระดับภายในช่วงที่ระบุเท่านั้น
![todo:image_alt_text](/words/net/working-with-table-of-contents/working-with-table-of-contents-5.png)
ช่อง `TC` เองก็สามารถตั้งค่าสวิตช์ได้ `{several, multiple, a few, many, numerous}` ชุดเช่นกัน เหล่านี้คือ:
- *\F – อธิบายไว้ข้างต้น*
- *\L – กำหนดระดับใน `TOC` ฟิลด์ TC นี้จะปรากฏใน `TOC` ที่ใช้สวิตช์เดียวกันนี้จะรวมฟิลด์ TC นี้เท่านั้นหากอยู่ภายในช่วงที่ระบุ*
- `_\N` – หมายเลขหน้าสำหรับรายการ `TOC` นี้จะไม่แสดง โค้ดตัวอย่างของวิธีการแทรกฟิลด์ TC สามารถพบได้ในส่วนถัดไป
|ลักษณะที่ปรากฏที่เกี่ยวข้องกับสวิตช์
สวิตช์ | คำอธิบาย |
---|---|
Omit Page Numbers (\N สวิตช์) |
สวิตช์นี้ใช้เพื่อซ่อนหมายเลขหน้าสำหรับ TOC บางระดับ ตัวอย่างเช่นคุณสามารถกำหนดได้ |
<p> {TOC \o "1-4" \n "3-4" } </p><p>
และหมายเลขหน้าในรายการระดับ 3 และ 4 จะถูกซ่อนไว้พร้อมกับจุดตัวนำ (ถ้ามี) หากต้องการระบุเพียงระดับเดียว ควรใช้ช่วง เช่น "1-1" จะยกเว้นหมายเลขหน้าสำหรับระดับแรกเท่านั้น
การไม่ระบุช่วงระดับจะละเว้นหมายเลขหน้าสำหรับทุกระดับใน TOC การตั้งค่านี้มีประโยชน์เมื่อส่งออกเอกสารเป็น HTML หรือรูปแบบที่คล้ายกัน เนื่องจากรูปแบบที่ใช้ HTML ไม่มีแนวคิดเกี่ยวกับหน้าใดๆ ดังนั้นจึงไม่จำเป็นต้องใส่หมายเลขหน้า
![todo:image_alt_text](/words/net/working-with-table-of-contents/working-with-table-of-contents-6.png)
| | **Insert As Hyperlinks***(\H สวิตช์)* |
สวิตช์นี้ระบุว่ารายการ `TOC` จะถูกแทรกเป็นไฮเปอร์ลิงก์ เมื่อดูเอกสารใน Microsoft Word รายการเหล่านี้จะยังคงปรากฏเป็นข้อความปกติภายใน `TOC` แต่มีไฮเปอร์ลิงก์ จึงสามารถใช้เพื่อนำทางไปยังตำแหน่งของรายการต้นฉบับในเอกสารได้โดยใช้ *Ctrl + คลิกซ้าย* ใน Microsoft Word เมื่อสิ่งนี้ รวมสวิตช์แล้วลิงก์เหล่านี้จะถูกเก็บรักษาไว้ในรูปแบบอื่นด้วย ตัวอย่างเช่นในรูปแบบที่ใช้ HTML รวมถึง EPUB และรูปแบบที่เรนเดอร์ เช่น PDF และ XPS สิ่งเหล่านี้จะถูกส่งออกเป็นลิงก์ที่ใช้งานได้
หากไม่มีสวิตช์นี้ ให้ตั้งค่า `TOC` ในเอาต์พุตเหล่านี้ทั้งหมดจะถูกส่งออกเป็นข้อความธรรมดา และจะไม่แสดงลักษณะการทำงานนี้ หากเปิดเอกสารใน MS Word ข้อความของรายการจะไม่สามารถคลิกได้ด้วยวิธีนี้ แต่ยังคงสามารถใช้หมายเลขหน้าเพื่อนำทางไปยังรายการต้นฉบับได้
![working-with-table-of-contents-titles](/words/net/working-with-table-of-contents/working-with-table-of-contents-7.png)
| | **Set Separator Character***(\P สวิตช์)* |
สวิตช์นี้ช่วยให้เนื้อหาที่แยกชื่อเรื่องของรายการและหมายเลขหน้าเปลี่ยนแปลงได้ง่ายใน TOC ควรระบุตัวคั่นที่จะใช้หลังสวิตช์นี้และอยู่ในเครื่องหมายคำพูด
ตรงกันข้ามกับสิ่งที่บันทึกไว้ในเอกสารประกอบของ Office คุณสามารถใช้อักขระได้เพียงตัวเดียวแทนอักขระสูงสุดห้าตัว สิ่งนี้ใช้ได้กับทั้ง MS Word และ Aspose.Words
ไม่แนะนำให้ใช้สวิตช์นี้ เนื่องจากไม่สามารถควบคุมสิ่งที่ใช้ในการแยกรายการและหมายเลขหน้าใน TOC ได้มากนัก ขอแนะนำให้แก้ไขสไตล์ `TOC` ที่เหมาะสมแทน เช่น `StyleIdentifier.TOC1` จากนั้นแก้ไขสไตล์ผู้นำด้วยการเข้าถึงสมาชิกแบบอักษรเฉพาะ เป็นต้น รายละเอียดเพิ่มเติมเกี่ยวกับวิธีการทำเช่นนี้ สามารถพบได้ในบทความ
![working-with-table-of-contents-toc](/words/net/working-with-table-of-contents/working-with-table-of-contents-8.png)
| | **Preserve Tab Entries***(\W สวิตช์)* |
การใช้สวิตช์นี้จะระบุว่ารายการใดๆ ที่มีอักขระแท็บ เช่น ส่วนหัวที่มีแท็บที่ท้ายบรรทัด จะถูกเก็บไว้เป็นอักขระแท็บที่เหมาะสมเมื่อเติม TOC ซึ่งหมายความว่าฟังก์ชันของอักขระแท็บจะปรากฏใน `TOC` และสามารถใช้เพื่อจัดรูปแบบรายการได้ ตัวอย่างเช่น บางรายการอาจใช้แท็บหยุดและอักขระแท็บเพื่อเว้นระยะห่างข้อความให้เท่ากัน ตราบใดที่ระดับ `TOC` ที่เกี่ยวข้องกำหนดแท็บหยุดที่เทียบเท่า รายการ `TOC` ที่สร้างขึ้นจะปรากฏขึ้นโดยมีระยะห่างใกล้เคียงกัน
ในสถานการณ์เดียวกัน หากไม่ได้กำหนดสวิตช์นี้ไว้ อักขระแท็บจะถูกแปลงเป็นช่องว่างที่เทียบเท่ากับแท็บที่ไม่ทำงาน ผลลัพธ์จะไม่ปรากฏตามที่คาดไว้
![working-with-table-of-contents-aspose](/words/net/working-with-table-of-contents/working-with-table-of-contents-9.png)
| | **Preserve New Line Entries***(\X สวิตช์)* |
เช่นเดียวกับสวิตช์ด้านบน สวิตช์นี้ระบุว่าส่วนหัวที่ขยายหลายบรรทัด (โดยใช้อักขระบรรทัดใหม่ไม่แยกย่อหน้า) จะถูกรักษาไว้เหมือนที่อยู่ใน TOC ที่สร้างขึ้น ตัวอย่างเช่น ส่วนหัวที่จะกระจายไปตามบรรทัดต่างๆ สามารถใช้อักขระบรรทัดใหม่ (Ctrl + Enter หรือ `ControlChar.LineBreak`) เพื่อแยกเนื้อหาไปตามบรรทัดต่างๆ เมื่อระบุสวิตช์นี้ รายการใน `TOC` จะรักษาอักขระบรรทัดใหม่เหล่านี้ไว้ดังที่แสดงด้านล่าง
ในสถานการณ์นี้ ถ้าไม่ได้กำหนดสวิตช์ไว้ อักขระบรรทัดใหม่จะถูกแปลงเป็นช่องว่างเดียว
![working-with-table-of-contents-aspose-words](/words/net/working-with-table-of-contents/working-with-table-of-contents-10.png)
|แทรกฟิลด์ TC
คุณสามารถแทรกฟิลด์ TC ใหม่ที่ตำแหน่งปัจจุบันของ DocumentBuilder ได้โดยการเรียกเมธอด InsertField และระบุชื่อฟิลด์เป็น “TC” พร้อมกับสวิตช์ใดๆ ที่จำเป็น
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการแทรกฟิลด์ TC
ลงในเอกสารโดยใช้ DocumentBuilder:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
// The path to the documents directory. | |
string dataDir = RunExamples.GetDataDir_WorkingWithDocument(); | |
// Initialize document. | |
Document doc = new Document(); | |
// Create a document builder to insert content with. | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
// Insert a TC field at the current document builder position. | |
builder.InsertField("TC \"Entry Text\" \\f t"); | |
dataDir = dataDir + "DocumentBuilderInsertTCField_out.doc"; | |
doc.Save(dataDir); |
บ่อยครั้งที่บรรทัดข้อความเฉพาะเจาะจงถูกกำหนดไว้สำหรับ TOC
และทำเครื่องหมายด้วยช่อง TC
วิธีง่ายๆ ในการทำเช่นนี้ใน Microsoft Word คือการไฮไลต์ข้อความแล้วกด ALT+SHIFT+O ซึ่งจะสร้างฟิลด์ TC
โดยอัตโนมัติโดยใช้ข้อความที่เลือก เทคนิคเดียวกันนี้สามารถทำได้ผ่านโค้ด โค้ดด้านล่างจะค้นหาข้อความที่ตรงกับอินพุตและแทรกฟิลด์ TC
ในตำแหน่งเดียวกันกับข้อความ รหัสนี้ใช้เทคนิคเดียวกับที่ใช้ในบทความ
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีค้นหาและแทรกฟิลด์ TC
ที่ข้อความในเอกสาร:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(); | |
FindReplaceOptions options = new FindReplaceOptions(); | |
// Highlight newly inserted content. | |
options.ApplyFont.HighlightColor = Color.DarkOrange; | |
options.ReplacingCallback = new InsertTCFieldHandler("Chapter 1", "\\l 1"); | |
// Insert a TC field which displays "Chapter 1" just before the text "The Beginning" in the document. | |
doc.Range.Replace(new Regex("The Beginning"), "", options); |
ปรับเปลี่ยนสารบัญ
การจัดรูปแบบของรายการใน TOC
ไม่ได้ใช้สไตล์ดั้งเดิมของรายการที่ทำเครื่องหมายไว้ แต่แต่ละระดับจะได้รับการจัดรูปแบบโดยใช้สไตล์ TOC
ที่เทียบเท่ากัน ตัวอย่างเช่น ระดับแรกใน TOC
ถูกจัดรูปแบบด้วยสไตล์ TOC1 ระดับที่สองถูกจัดรูปแบบด้วยสไตล์ TOC2 และอื่นๆ ซึ่งหมายความว่าหากต้องการเปลี่ยนรูปลักษณ์ของ TOC
จะต้องแก้ไขสไตล์เหล่านี้ ใน Aspose.Words สไตล์เหล่านี้จะแสดงโดย StyleIdentifier.TOC1
อิสระของโลแคลไปจนถึง StyleIdentifier.TOC9
และสามารถดึงข้อมูลจากคอลเลกชัน Styles โดยใช้ตัวระบุเหล่านี้
เมื่อดึงข้อมูลสไตล์ที่เหมาะสมของเอกสารแล้ว การจัดรูปแบบสำหรับสไตล์นี้จะสามารถแก้ไขได้ การเปลี่ยนแปลงใดๆ ที่เกิดขึ้นกับสไตล์เหล่านี้จะมีผลกับ TOC ในเอกสารโดยอัตโนมัติ
ตัวอย่างโค้ดต่อไปนี้จะเปลี่ยนคุณสมบัติการจัดรูปแบบที่ใช้ในสไตล์ TOC
ระดับแรก:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(); | |
// Retrieve the style used for the first level of the TOC and change the formatting of the style. | |
doc.Styles[StyleIdentifier.Toc1].Font.Bold = true; |
นอกจากนี้ ยังมีประโยชน์ที่จะต้องทราบว่าการจัดรูปแบบโดยตรงใดๆ ของย่อหน้า (กำหนดไว้ในย่อหน้านั้นและไม่ใช่ในรูปแบบ) ที่ทำเครื่องหมายให้รวม TOC
จะถูกคัดลอกไปไว้ในรายการใน TOC ตัวอย่างเช่น หากใช้สไตล์หัวเรื่อง 1 เพื่อทำเครื่องหมายเนื้อหาสำหรับ TOC
และสไตล์นี้มีการจัดรูปแบบตัวหนา ในขณะที่ย่อหน้าก็มีการใช้การจัดรูปแบบตัวเอียงโดยตรงด้วย รายการ TOC
ที่ได้จะไม่เป็นตัวหนาเนื่องจากเป็นส่วนหนึ่งของการจัดรูปแบบสไตล์ แต่จะเป็นตัวเอียงเนื่องจากมีการจัดรูปแบบโดยตรงในย่อหน้า
คุณยังสามารถควบคุมการจัดรูปแบบของตัวคั่นที่ใช้ระหว่างแต่ละรายการและหมายเลขหน้าได้ ตามค่าเริ่มต้น นี่คือเส้นประซึ่งกระจายไปทั่วหมายเลขหน้าโดยใช้อักขระแท็บและแท็บหยุดด้านขวาเรียงชิดกับระยะขอบด้านขวา
การใช้คลาส Style ที่ดึงมาสำหรับระดับ TOC
เฉพาะที่คุณต้องการแก้ไข คุณยังสามารถแก้ไขลักษณะที่ปรากฏของสิ่งเหล่านี้ในเอกสารได้อีกด้วย หากต้องการเปลี่ยนลักษณะที่ปรากฏก่อนอื่น จะต้องเรียก ParagraphFormat เพื่อดึงการจัดรูปแบบย่อหน้าสำหรับสไตล์ จากนี้ คุณสามารถดึงข้อมูลแท็บหยุดได้โดยการเรียก TabStops และแก้ไขแท็บหยุดที่เหมาะสม การใช้เทคนิคเดียวกันนี้ทำให้สามารถย้ายหรือลบแท็บทั้งหมดพร้อมกันได้
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีแก้ไขตำแหน่งของแท็บหยุดด้านขวาในย่อหน้าที่เกี่ยวข้องกับ TOC
:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
// The path to the documents directory. | |
string dataDir = RunExamples.GetDataDir_WorkingWithStyles(); | |
string fileName = "Document.TableOfContents.doc"; | |
// Open the document. | |
Document doc = new Document(dataDir + fileName); | |
// Iterate through all paragraphs in the document | |
foreach (Paragraph para in doc.GetChildNodes(NodeType.Paragraph, true)) | |
{ | |
// Check if this paragraph is formatted using the TOC result based styles. This is any style between TOC and TOC9. | |
if (para.ParagraphFormat.Style.StyleIdentifier >= StyleIdentifier.Toc1 && para.ParagraphFormat.Style.StyleIdentifier <= StyleIdentifier.Toc9) | |
{ | |
// Get the first tab used in this paragraph, this should be the tab used to align the page numbers. | |
TabStop tab = para.ParagraphFormat.TabStops[0]; | |
// Remove the old tab from the collection. | |
para.ParagraphFormat.TabStops.RemoveByPosition(tab.Position); | |
// Insert a new tab using the same properties but at a modified position. | |
// We could also change the separators used (dots) by passing a different Leader type | |
para.ParagraphFormat.TabStops.Add(tab.Position - 50, tab.Alignment, tab.Leader); | |
} | |
} | |
dataDir = dataDir + RunExamples.GetOutputFilePath(fileName); | |
doc.Save(dataDir); |
ลบสารบัญออกจากเอกสาร
สารบัญสามารถลบออกจากเอกสารได้โดยการลบโหนดทั้งหมดที่พบระหว่างโหนด FieldStart
และ FieldEnd ของฟิลด์ TOC
รหัสด้านล่างแสดงให้เห็นถึงสิ่งนี้ การลบฟิลด์ TOC
นั้นง่ายกว่าฟิลด์ปกติ เนื่องจากเราไม่ได้ติดตามฟิลด์ที่ซ้อนกัน แต่เราตรวจสอบว่าโหนด FieldEnd เป็นประเภท FieldType.FieldTOC ซึ่งหมายความว่าเราพบจุดสิ้นสุดของ TOC ปัจจุบันแล้ว เทคนิคนี้สามารถใช้ได้ในกรณีนี้โดยไม่ต้องกังวลเกี่ยวกับฟิลด์ที่ซ้อนกัน เนื่องจากเราสามารถสรุปได้ว่าเอกสารที่มีรูปแบบเหมาะสมใดๆ จะไม่มีฟิลด์ TOC
ที่ซ้อนกันโดยสมบูรณ์ภายในฟิลด์ TOC
อื่น
ประการแรก โหนด FieldStart ของแต่ละ TOC
จะถูกรวบรวมและจัดเก็บ จากนั้น TOC
ที่ระบุจะถูกแจกแจง ดังนั้นโหนดทั้งหมดภายในฟิลด์จึงถูกเยี่ยมชมและจัดเก็บ จากนั้นโหนดจะถูกลบออกจากเอกสาร
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีลบ TOC
ที่ระบุออกจากเอกสาร:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
public static void Run() | |
{ | |
// The path to the documents directory. | |
string dataDir = RunExamples.GetDataDir_WorkingWithStyles(); | |
// Open a document which contains a TOC. | |
Document doc = new Document(dataDir + "Document.TableOfContents.doc"); | |
// Remove the first table of contents from the document. | |
RemoveTableOfContents(doc, 0); | |
dataDir = dataDir + "Document.TableOfContentsRemoveToc_out.doc"; | |
// Save the output. | |
doc.Save(dataDir); | |
Console.WriteLine("\nSpecified TOC from a document removed successfully.\nFile saved at " + dataDir); | |
} | |
/// <summary> | |
/// Removes the specified table of contents field from the document. | |
/// </summary> | |
/// <param name="doc">The document to remove the field from.</param> | |
/// <param name="index">The zero-based index of the TOC to remove.</param> | |
public static void RemoveTableOfContents(Document doc, int index) | |
{ | |
// Store the FieldStart nodes of TOC fields in the document for quick access. | |
ArrayList fieldStarts = new ArrayList(); | |
// This is a list to store the nodes found inside the specified TOC. They will be removed | |
// At the end of this method. | |
ArrayList nodeList = new ArrayList(); | |
foreach (FieldStart start in doc.GetChildNodes(NodeType.FieldStart, true)) | |
{ | |
if (start.FieldType == FieldType.FieldTOC) | |
{ | |
// Add all FieldStarts which are of type FieldTOC. | |
fieldStarts.Add(start); | |
} | |
} | |
// Ensure the TOC specified by the passed index exists. | |
if (index > fieldStarts.Count - 1) | |
throw new ArgumentOutOfRangeException("TOC index is out of range"); | |
bool isRemoving = true; | |
// Get the FieldStart of the specified TOC. | |
Node currentNode = (Node)fieldStarts[index]; | |
while (isRemoving) | |
{ | |
// It is safer to store these nodes and delete them all at once later. | |
nodeList.Add(currentNode); | |
currentNode = currentNode.NextPreOrder(doc); | |
// Once we encounter a FieldEnd node of type FieldTOC then we know we are at the end | |
// Of the current TOC and we can stop here. | |
if (currentNode.NodeType == NodeType.FieldEnd) | |
{ | |
FieldEnd fieldEnd = (FieldEnd)currentNode; | |
if (fieldEnd.FieldType == FieldType.FieldTOC) | |
isRemoving = false; | |
} | |
} | |
// Remove all nodes found in the specified TOC. | |
foreach (Node node in nodeList) | |
{ | |
node.Remove(); | |
} | |
} |
แยกสารบัญ
หากคุณต้องการแยกสารบัญจากเอกสาร Word ใดๆ คุณสามารถใช้ตัวอย่างโค้ดต่อไปนี้:
// The path to the documents directory. | |
string dataDir = RunExamples.GetDataDir_WorkingWithDocument(); | |
string fileName = "TOC.doc"; | |
Aspose.Words.Document doc = new Aspose.Words.Document(dataDir + fileName); | |
foreach (Field field in doc.Range.Fields) | |
{ | |
if (field.Type.Equals(Aspose.Words.Fields.FieldType.FieldHyperlink)) | |
{ | |
FieldHyperlink hyperlink = (FieldHyperlink)field; | |
if (hyperlink.SubAddress != null && hyperlink.SubAddress.StartsWith("_Toc")) | |
{ | |
Paragraph tocItem = (Paragraph)field.Start.GetAncestor(NodeType.Paragraph); | |
Console.WriteLine(tocItem.ToString(SaveFormat.Text).Trim()); | |
Console.WriteLine("------------------"); | |
if (tocItem != null) | |
{ | |
Bookmark bm = doc.Range.Bookmarks[hyperlink.SubAddress]; | |
// Get the location this TOC Item is pointing to | |
Paragraph pointer = (Paragraph)bm.BookmarkStart.GetAncestor(NodeType.Paragraph); | |
Console.WriteLine(pointer.ToString(SaveFormat.Text)); | |
} | |
} // End If | |
}// End If | |
}// End Foreach |