我正在使用Adafuit_ST7735(带有Adafuit_GFX(库在我的1.8 TFT显示器上显示内容。当我设置tft.setTextWrap(false(它确实包装了文本,但不在乎单词。例如,它是这样包装的:
我喜欢玩篮球
tball,我真的很喜欢玩电脑
r游戏
我需要让它看起来像这样:
我喜欢玩篮球
etball,我真的
喜欢玩comp-
uter游戏
将短单词放在下一行,但将长单词拆分为两行并用-连接,这将使我能够显示比将每个单词放在新行多得多的文本。我对此的主要挣扎是,角色们以这样的SD方式一个接一个地出现:
File myFile = SD.open(file_name);
if (myFile) {
while (myFile.available() > myFile.size() - 300) {
tft.write(myFile.read());
}
myFile.close();
} else {
tft.print("Error opening file.");
}
我该如何为输入的字符编写这样一个文字处理器,以便短单词(即包含小于或等于5个字符(被转移到下一行,而长单词(即含有5个以上字符(被用-剪切,一部分在一行,另一部分在下一行(如上一个示例(?
这个问题被称为连字符,它并非微不足道。MS Word等文本编辑器也具有此功能,请参阅https://practicaltypography.com/hyphenation.html
存在断字算法(https://en.wikipedia.org/wiki/Hyphenation_algorithm),例如Knuth Liang算法,Donald Knuth写了著名的TeX(https://en.wikipedia.org/wiki/TeX)
c#中的断字
最佳换行算法?
C中有类似的库https://github.com/hunspell/hyphen它们也非常复杂。如果你找到一个更简单的解决方案,可以用搜索词"连字符"在网上搜索。一般来说,问题是复杂的(音节检测,…(
我认为最简单的解决方案是完全跳过连字符,并使用空格来分隔单词(在一个句子中,任何单词之间都是空格…(
您将更改
tft.write(myFile.read());
读取中间字符串,在其中进行连字符。
如果Arduino上的内存不足,无法进行完整的连字符库
- 根据文本的来源,如果它总是显示在同一列中,您可以在文本文件中手动进行连字符(并在行中填充空格(或
- 您可以预先半自动标记所有位置,在这些位置可以使用连字符。算法只是删除中间字符串中的这些标记或用换行符替换它们
- 有些删节的连字符库并不能找到所有的连字符位置,但比没有连字符要好得多
最简单的连字符算法(假设学校英语(是在最后一个辅音*处打断一个单词,这个辅音*将适合行。但这需要多个步骤:
- 将字母一行一个单词(标点符号*之间(
- 检测行的字符限制
- 后退到辅音或标点符号
我在上面用星号*表示了列表。标点符号:空格、连字符、撇号、引号(你能干净地转义引号吗?(、通用标点符号辅音:容易列出的
快速br-
自己的狐狸跳跃-
通过sl-
噢,懒狗。
四sco-
re和s-
偶数y-
几年前
我们的
默认
设置
在上
这个新的
contin-
ent