gpt4 book ai didi

adobe-indesign - inDesign JSX 脚本将标题和内容添加到 textFrame

转载 作者:行者123 更新时间:2023-12-04 18:42:02 24 4
gpt4 key购买 nike

我正在尝试使用 inDesign JSX 脚本将以下数据插入到文档中:

data = [{heading:"Heading 1", content: ["Some content"]},
{heading:"Heading 2", content: ["Some other content with", "Multiple paragraphs"]}]

数据必须放置在单个 TextFrame 中,但在标题和内容上具有不同的样式。

我可以看到添加文本的唯一方法是通过 textFrame.contents 一次性完成多变的:
allContent = "";
headingParagraphs = []; // keep track of which paragraphs are headings
paragraph = 0;
for (var i = 0; i < data.length; i++) {
allContent += data.heading + "\r"; // Use a newline to split the paragraph
headingParagraphs.push(paragraph);
paragraph++;
for (var j = 0; j < data.content.length; j++) {
allContent += data.content[j] + "\r"; // Use a newline to split the paragraph
paragraph++;
}
}
textFrame.contents = allContent; // all data is in, but all text is styled the same

然后一旦数据输入,我迭代段落并为标题添加一些样式:
for (var i = 0; i < textFrame.paragraphs.count(); i++) {
if (headingParagraphs.indexOf(i) != -1) { // this is a heading paragraph
textFrame.paragraphs[i].pointSize = 20;
}
}

这适用于适合一页的小数据集,但一旦内容大于框架, paragraphs只返回可见的段落。如果我继续使用一个新的 textFrame,段落会被拆分并且 headingParagraphs[]阵列不再排队。

理想情况下,我想在附加下一个内容之前附加到内容并设置样式 - 但 API 文档并不太清楚你如何做到这一点(如果有的话)
// Pseudo code:
for all sections:
append the heading to the frame, split to next page if needed
style all the *new* paragraphs as headings
for all section contents
append the content to the frame, split to next page if needed
style any *new* paragraphs as normal content

有没有办法使用附加功能或其他方式在添加内容后将标题分配到正确的位置来实现这一点?也许内容中的特殊字符来定义样式?

最佳答案

您的较长文本会被弄乱,因为目前您正在单个 中工作。文本框 .一旦文本用完这一框架,您就不能再将它们称为该框架的“拥有”段落。使用 parentStory相反,因为它指向整个故事,在一个文本框架内或跨越多个文本框架。如果文本溢出,它也会继续工作。

因此,如果您有一个名为 textFrame 的起始帧, 设置一个新变量 storytextFrame.parentStory并使用它来添加文本。

至于向这个框架(/story)添加文本:确实,没有快速添加格式化文本的方法。设置 contents仅适用于具有相同格式的长条。我使用的一种方法是将 INX 格式的文本写入临时文件并导入。对于短片段来说速度很慢,但是在 Javascript 本身中可以非常有效地创建更大的故事(最多数百页),然后将其导入 ID 是......好吧,它比尝试“手动”更快但速度更快.

另一种方法是一次添加一段内容。诀窍是设置格式并将您的文本添加到 story.insertionPoints[-1] .这在一个特别方便的符号中,指的是故事的最后一个文本插入点。您可以将插入点视为“文本光标”;您可以对其“应用”格式,然后添加的任何文本也将具有此格式。

您的代码片段经过重新设计,添加了一个 data项目一次:

for (var i = 0; i < data.length; i++)
{
story.insertionPoints[-1].pointSize = 20;
story.insertionPoints[-1].contents = data[i].heading + "\r"; // Use a newline to split the paragraph
story.insertionPoints[-1].pointSize = 10;
for (var j = 0; j < data[i].content.length; j++)
{
story.insertionPoints[-1].contents = data[i].content[j] + "\r"; // Use a newline to split the paragraph
}
}

需要注意的一件事是您不能暂时覆盖 pointSize这里。如果您将其设置为较大的尺寸,则还必须再次将其设置回原始尺寸(我的代码片段中的“10”)。

我可以说服您考虑使用段落样式吗?使用段落样式,你会有类似的东西

hdrStyle = app.activeDocument.paragraphStyles.item("Header");
textStyle = app.activeDocument.paragraphStyles.item("Text");

for (var i = 0; i < data.length; i++)
{
story.insertionPoints[-1].contents = data[i].heading + "\r"; // Use a newline to split the paragraph
story.insertionPoints[-2].appliedParagraphStyle = hdrStyle;
for (var j = 0; j < data[i].content.length; j++)
{
story.insertionPoints[-1].contents = data[i].content[j] + "\r"; // Use a newline to split the paragraph
story.insertionPoints[-2].appliedParagraphStyle = textStyle;
}
}

请注意,在这里反转插入内容和应用格式是值得的。这是为了清除任何以前的“临时”格式;以这种方式应用段落样式会覆盖任何和所有本地覆盖。由于您必须将样式应用于上一段(刚插入的硬回车之前的段落),因此您可以使用 insertionPoints[-2]这里。

与本地格式相比,使用样式的优势数不胜数。您可以使用单个命令应用您想要的所有格式,安全地删除所有本地覆盖的格式,如果您不满意,可以全局更改格式的任何部分,而不必使用稍微不同的设置重新运行脚本。

关于adobe-indesign - inDesign JSX 脚本将标题和内容添加到 textFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23985785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com